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

こんなのが動きました。(感激)


※「SICPを読もう」の目次はこちら


計算機プログラムの構造と解釈
ジェラルド・ジェイ サスマン ジュリー サスマン ハロルド エイブルソン 和田 英一
ピアソンエデュケーション (2000/02)
売り上げランキング: 56,404