2012年4月21日土曜日

[お勉強] 簡単なLISPのインタプリタを実装してみよう


LISPに入門したいな〜と思ってはや半年。なんか、言ってるだけな気がして嫌気が刺してきましたので。入門しようとLISPとGoogleで検索したら。
ちょっと変わったLISP入門 という、記事をみつけました。
この記事では、LISP 入門するついでに、LISPをC言語で実装しちゃおうという、ちょっとどころじゃなくかなり、変わった入門でした。

という、経緯で始めたLISPインタプリタの実装なんですが。その記事通りに書いても面白くないので。
データ構造だけチラ見して、自分でほとんど一から実装しました。

ひさしぶりに、C言語を使いました。(最近はもっぱらPython)次々とポインタを別のポインタにキャストしながら。実装していくこと。5時間程度。 

LISP の式をリストに落として簡単にevalすることができるようになりました。
とはいえ、まだほとんどの機能が実装されていません。(書き方が変な電卓みたいな感じ)

その後、四苦八苦しながらsetqを実装し、defunを実装しました。

スタックはグローバルと分けて考えてスタックから先に探索するという方法をとりました。

正直、スタックを考えたり、変数への束縛を考えたりするのは楽しかった。
今まで、書いてきたコマンドラインのプログラムの中で一番楽しいと言えるものかもしれない。

一応Githubに上げて有ります。
https://github.com/higumachan/easy_lisp
しかし、ファイル分割もしてないですし、ましてやプロトタイプ宣言すらめんどくさがってしまった書き捨てのコードです。

まだ、語ってないことにGC(ガーベジコレクタ)がありますが。長くなりそうなので。
これは、また明日書くことにします。

1 件のコメント:

  1. 一から実装とは、素晴らしい。
    ちょっと変わった~は一年近く前に見つけてトライしたものの、力及ばずで最後まで動かせませんでした。
    もう一度、他の処理系でも見つけてやり直そう、と思った時に、こちらを見つけました。
    感謝です!

    動作原理を具体的に調べたいし、中に手を入れて試してみたいので、
    この大きさが良いのです。
    ただコンパイルが通らず、グローバル変数に一行追加が必要でした。
    int evaling = -1;

    返信削除