関数型言語の勉強に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
