空想犬猫記

※当日記では、犬も猫も空想も扱っておりません。(旧・エト記)

etolisp進捗(1)

今日は時間があったのでetolisp*1の実装を行う。今日の目玉はlambdaの実装。lambdaは,関数やクロージャの定義の他にも,lexical context(ローカル変数)の定義にも使う。プログラムを抽象化,モジュール化させる機能を一手に引き受けてしまうのだ。そう考えると「λすごい」と感じずにはいられない。そんな「すごいλ」を実装してる自分も,なにかすごいことをやらかしているような気がしてドキドキするのだが,それは間違い。Lispの仕様が本当に良く出来ているのだ。
実装は,Valueから派生させたLambda型を定義して,その中にローカルなシンボルテーブルの素(lexical context seedと名付けた)を内包させる。そんでもってLambda型変数が関数として評価されるときにseedを元にローカルなシンボルテーブルを作成し,Lispのエンジンにテーブルをpushしてevalし,終わったらpopするという感じの実装にしてみた。そうしてLispの関数lambdaが評価されると,評価値としてLambda型変数が返ってくるという仕組みである。実際のコードでは

pLambdaValue->asFunction( pEngine, pConsValue );

みたいな感じでlambda式を評価できる(pEngineが処理系の自身で,pConsValueは関数の引数に相当)。多態を使っているので,この辺りはC++で実装された関数と全く区別する必要がない。
ここまで出来上がると,あとはC++の関数と一対一に対応したLispの関数をひとつずつ追加していけば良い。この先の作業はスケーラブルなので,完成までは時間の問題である。あとは地道に続けられるかどうかだ。今日までのコードで約1,300行程度。思ったよりもずっとコンパクトだ。最終的には15,000行くらいにおさめたいところ。

ANSI Common LISP (Prentice Hall Series in Artificial Intelligence) ANSI Common Lisp (スタンダードテキスト)

*1:現在xoinuが作成中のCommon-Lisp処理系