撫子からにんじんへ
トイ言語Nadekoの名前をCarrotに変えた。Schemeの一番最初のコンパイラの名前がRabbitだったらしいので割とお洒落な気がする。うさぎはにんじんが好きっていうのだけじゃなくて、
Rabbit
Carrot
で同じ文字数な上に文字がダブる位置まで一緒だから超お洒落だと思う。
表面上変わったのは名前だけだけど中身はばっちり変えた。VMがKrivineマシンだったのをSマシンにしたり、ホスト言語(Scheme)の手続きを呼ぶとこでThunkを溶かすためにVMを毎回立ち上げてたのをなくして全部末尾呼び出しにしたり、名前呼び出しだったのを必要呼び出しにしたり(不完全かも)、GCつけたりした。 特にホスト言語の手続きを呼ぶのが大変で、うまい事動かすのに一週間くらいかかったし、コードがとても汚くなった。
評価がとてつもなく遅い理由の半分くらいは、ほぼ全部を純粋関数で書いたから。GCまでHashtable->Hashtableな純粋関数。例のzipWith使ってフィボナッチ数列を求めるやつで10個目まで求めて表示するのに僕のMacBook Airで4秒くらいかかる。もう半分はVMが非効率だからで、fibのやつだと100万ステップくらいかかる。
(= fib (cons 1 (cons 1 (zipWith fib + (cdr fib))))) (fib -take 10 -reverse -fold (comp (comp ++ (++ ",")) num->str) "")
今そこら中に散らかってる条件分岐をどうにかこうにか減らしたり、コンパイルの段階でASTをいじってやればちょぴっと速くなると思う。でもこの実装では実用を目指してないからコードさえ綺麗にすればいいと思う。
あとやりたいのは静的型付けくらい。