読者です 読者をやめる 読者になる 読者になる

プログラミング言語Egisonのパターンマッチ機能をLua上で実装してみた

Programming Language Egison
プログラミング言語Egisonは、強力なパターンマッチ機能を持つという。とりあえず、同じような機能をLua上で使えるように、MoonScriptを使って実装してみた。
mandel59/egimoon · GitHub

print show match_all {1, 2, 3}, (List Number),
  [cons var('x'), var('ts')]: => {@x, @ts}

print show match_all (mkmultiset {1, 2, 3}), (Multiset Number),
  [cons var('x'), var('ts')]: => {@x, (unmultiset @ts)}

print show match_all {1, 2, 3}, (List Number),
  [join var('xs'), var('ys')]: => {@xs, @ys}

print show match_all {1, 2, 3, 1, 2}, (List Number),
  [cons var('n'), cons val(=> @n), var!]: => @n

print show match_all (mkmultiset {1, 2, 3, 1, 2}), (Multiset Number),
  [cons var('n'), cons val(=> @n), var!]: => @n

出力はこんな感じ。

egimoon$ moon example.moon
{{1,{2,3}}}
{{1,{2,3}},{2,{1,3}},{3,{1,2}}}
{{{},{1,2,3}},{{1},{2,3}},{{1,2},{3}},{{1,2,3},{}}}
{1}
{1,2}

手抜きだし、足りない機能はあるが、案外簡単に実装できた。徹夜になったけど。