Mono (.NET のオープンソース実装)をハックしてたり、Nemerle という言語のコンパイラをいじったりしていてすごく忙しかったのです。
ごめんなさい!これから追いつきます。
旧ヴァージョンの Fulyn はこちらへ。
パーサはできたので、今型推論器を書いています。
Fulyn v1 は美しくないところがまだまだあったので、言語仕様をさらにシンプルにし、それでいて表現力をさらにあげます。
Fulyn v2 では、プログラムを式の列として扱います。
式には、定数、関数、代入文、パターンマッチ文、リテラルなどがあります。
型推論はもっと頑張ります。
Fulyn v2 では、ブロック自体を一つの式として扱います。
これにより、複文ラムダの実現が可能になります。
これで、関数をラムダで書くことが可能になります。
main = () => { x = plusone(5) putnum(x) } plusone = i => add(i, 1)
v1 では、定数パターンしか存在しませんでしたが、変数パターン、Cons パターンなどのその他のパターンも実装します。
変数パターンはすべての入力にマッチするので、 v1 の () => ... は廃止されます。
source = read() result = ? source { | 'y' => 1 | 'n' => 0 | x => { print("invalid answer: "); print(x); -1 } }
array = [0, 1, 2] tail_of_array = ? array { | head :: tail => tail | _ => [] }
Fulyn v2 ではマクロをサポートするかもしれません。 割とめんどくさいのでボツになる可能性はあります。 まだ処理系ができていないので、現状はコンパイル時計算は行えず、いまの実装は単純な構文置換です。
<( if :: "if", "(", cond, ")", expr1, "else", expr2, "fi" -> ? cond { | true -> expr1 | _ -> expr2 } )>
というマクロは、
if(x) print("yes") else print("no") fi
というコードを、
? x { | true -> print("yes") | _ -> print("false") }
に置換します。
コメント | お名前 | NameLink | |