etolisp 進捗 (7)
仕事も終わり,今日一日は OFF。おみやげとクリスマスプレゼントの買い物を済ませ,etolisp をいじることにする。d:id:xoinu:20060526 から長らく塩漬けになっていた。defun を実装して再帰がちゃんと動くことを確認。段々,自分が作ったインタプリタが,自分自身より賢くなってきていることを実感。自分が作ったソフトにエラーを指摘されたり「お前の実装じゃまだそんなこたできねーよ」と自分の作った etolisp に指摘されるのは,何だか,面白い。
GNU Readline Library を利用して,インタラクティブモードも実装。これでかなりテストがしやすくなった。
私の場合,SICP 読んで理論を学んでから,ってんではなくて完全にテスト駆動で開発している。だから,もしかしたらもの凄い珍妙な実装になってるかもしれない…。etolisp は今のところ
- 以下のタイプをネイティブにサポート。ユーザー定義型はまだ未実装。
- ValueCons
- ValueSymbol
- ValueLambda
- ValueFunction
- ValueFunctionImmediate
- ValueFunctionDeferred
- ValueFunctionSetf
- ValueInteger
- ValueDouble
- ValueString
- ValueT
- ValueNil
- ValueOstream
- ValueIStream
- 構文木は二分木(car,cdr)
- Cons は参照カウンタでメモリ管理しているが,相互参照すると平気でリークする。将来的には GC を導入予定
- 変数,コンパイル済み関数,lambda 式も全て Value(なので #' と' の区別はない)
- コンパイル済み関数は C の関数に一対一対応(クラスにしなかった。ValueFunction を関数ポインタで初期化して,シンボルテーブルに登録して使う。同じ関数でも,ValueFunction の振る舞いに色んなテイストを付けてごにょごにょしようと画策中。)
- 今のところ使える関数(かなり気ままに実装中)
- setf, setq
- defun
- do
- if
- lambda
- progn
- quote
- and,...各種演算子
- car
- cdr
- cons
- consp
- eql
- eval
- fboundp
- format
- let
- list
- listp
- not
- null
- prin1
- princ
- symbol-function
- terpri
- third
関数の定義,再帰,フロー制御,ローカル変数など基本的なところは動くようになったので,あとは地道に対応関数を増やして行こうかな。日の目を見る日は来るのだろうか・・・。私は Lisp の専門家でもなんでもなく,入門書を読みながら,入門書のサンプルコードが全て動くインタプリタを実装するというスタンスでやっている。ただ一つのルールは,自分が納得できるデザインにすること。なので,三日後には全然違うコードになってるかもしれない。