Fulyn v2

しばらく触ってない間にいろいろ変わってしまった!

Mono (.NET のオープンソース実装)をハックしてたり、Nemerle という言語のコンパイラをいじったりしていてすごく忙しかったのです。

ごめんなさい!これから追いつきます。

旧ヴァージョンの Fulyn はこちらへ

進捗

パーサはできたので、今型推論器を書いています。

v2 の特徴

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

トップ   新規 一覧 単語検索 最終更新   ヘルプ   最終更新のRSS