Lazy K で Lisp インタプリタ
https://github.com/irori/lazyk-lisp
http://lazy-k.appspot.com/p/ptHm_GwfAY
Lazy K でも Lisp インタプリタを作ってみました。
機能は Unlambda 版とだいたい同じですが call/cc が無くなり、代わりに set でグローバル変数に代入できるようになりました。局所変数の書き換えは大変すぎるので断念しました…。
今回はジェネレータとして、以前作った Haskell → Lazy K トランスレータを使いました。200 行ほどの Haskell コードを変換して 300kb の Lazy K プログラムになりました。ジェネレータの抽象度が高い分、Unlambda 版よりかなり大きくなってしまいました。一方インタプリタのコーディングは単なる Haskell なのでこっちの方が楽でした。(モナドが使えないとか let でパターンが使えないとか、エラーメッセージが殆どノーヒントとか色々制限はありますが。)
ちなみに lisp.hs は正しい Haskell プログラムなので、GHC でもコンパイルできます。当たり前ですがコンパイルしたものはずっと速いです。
遅い理由のひとつはシンボルを文字列のまま扱ってるからで、Unlambda 版と同様にシンボルテーブルを作って整数比較で済むようにすればもう少し速くなると思います。