関数型言語の勉強にSICPを読もう - (61) 4章 - 超言語的抽象(220ページ) C++でSchemeインタプリタを作ろう10
Primitive Procedureの実装をした。
例えば + という手続きがあるがこれはSchemeインタプリタが primitive に持つ手続きである。
Schemeのオブジェクト define/lambda/Variableなどを組み合わせだけでは作れないものである。
このような Primitive Procedureはインタプリタ起動時に Environment に追加される。
environment->defineVariable(new Variable("+"), new Plus());
Plusは PrimitiveProcedureクラスを継承したクラスで、"+"という名前でアクセスできるようになります。
applyでは Primitive Procedureかどうかで分岐し、Plus::applyが呼ばれます。
結構適当な実装です。桁あふれとか考慮してません。
Object* Plus::apply(Objects* arguments) { int total = 0; for (Objects::iterator it = arguments->begin(); it != arguments->end(); it++) { Object* o = (*it); if (o->type() == Object::NUMBER) { Number* n = (Number*)o; total += n->value(); } } return new Number(total); }
思ったよりも簡単だった。基盤となるシステムがある程度完成してきた証拠かな。
(begin (define plus6 (lambda (x) (+ x 6))) (plus6 94))
こんなのが動きました。(感激)
計算機プログラムの構造と解釈
posted with amazlet on 06.05.31