二週間でオレオレ言語を作るプロジェクト (2日目)
今日やった作業は以下の通りです。
今日の時点で階乗を計算する以下のプログラム(構文はまだ未確定)が 動くようになりました。
rec fact = \n -> if n == 0 then 1 else n * fact (n - 1) in print (fact 5)
実行すると構文解析結果として
(rec fact : (Int -> Int) = (\n : Int -> (if ((n : Int) == 0) then 1 else ((n : I nt) * ((fact : (Int -> Int)) ((n : Int) - 1))))) in (print ((fact : (Int -> Int) ) 5)))
型推論結果として
Int
クロージャ変換の結果として
=== function@001 === (if (<GetArg> == 0) then 1 else (<GetArg> * (<GetEnv 0> (<GetArg> - 1)))) === Main === (rec fact : (Int -> Int) = (MakeClos function@001 (fact : <11>)) in (print ((fac t : (Int -> Int)) 5)))
実行結果として
120
が得られます。
明日は上のfact関数を実際に.NETのILに変換するコンパイラを実装したいと 思います。