関数型言語の勉強にSICPを読もう - (55) 4章 - 超言語的抽象(218-219ページ) C++でSchemeインタプリタを作ろう3

さらっと流して書いていますが、実は設計にはとても時間がかかってる。
なにぶん初めてなので行ったり戻ったりがあるので。

self->evaluating?

number, stringのとき true

    if (exp->type() == Object::NUMBER || exp->type() == Object::STRING)
    {
        return true;
    }

quote

quoteの実装に迷う。
quoteを eval したときには何になればよいだろうか?
C++側は、eval後の型を規定しなければならないんだけどうーん。
とりあえず自分自身を返すようにしてみた。

definition/assignment

特筆すべきことはない。

lambda

lambda式の実装です。「俺ってば、いまlambda式の実装しているんだぜ」と自慢できます。


lambdaは eval されると procedure が返ります。(make-procedure)
make-procedureは作らずに Procedure を newして返します。

    else if (is_lambda(exp))
    {
        Lambda* lambda = (Lambda*)exp;
        Procedure* procedure = new Procedure(lambda, env);
        return (Object*)procedure;
    }

if

Schemeの if は三項演算子っぽい。
昨日省略したつもりだったけど、結局今日現れた。
if の eval は if 自身に実装しました。とっても素敵。


1つめの引数はいらない気がするけど、しばらく様子見。

Object* SpecialIf::eval(SpecialIf* specialIf, Environment* env)
{
    if (isTrue(::eval(specialIf->predicate(), env)))
    {
        return ::eval(specialIf->consequent(), env);
    }
    else
    {
        return ::eval(specialIf->alternative(), env);
    }
}

if は C++予約語なので SpecialIfというクラスにしました。


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


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