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

やっとSICPのページが進みました。

問題4.4

特殊形式 and, orをインタプリタに追加せよという問題。
皆さんもご存知の通り、and, orは「ショートサーキット演算子(ショートカット演算子)」なので引数の全てが評価されるとは限りません。
そのあたりがポイントかな。


今回やることは以下の通り

Translatorに and のtranslateを追加

        else if (function->text == "and")
        {
            return translateAnd(node, object);
        }
int Translator::translateAnd(Node* node, Object** object)
{
    Objects* objects = new Objects;
    for (int i = 1; i < node->nodes.size(); i++)
    {
        Object * object;
        int ret = translate(node->nodes[i], &object);
        if (ret != SUCCESS) return ret;
        objects->push_back(object);
    }
    *object = new And(objects);
    return SUCCESS;
}

Andクラスの追加

And::And(Objects* objects) : objects_(objects)
{
}

And::~And()
{
}

std::string And::toString()
{
    return "and";
}

int And::type() const
{
    return Object::AND;
}

Object* And::eval(Environment* env)
{
    for (Objects::iterator it = objects_->begin(); it != objects_->end(); it++)
    {
        Object* o = (*it);
        if (!isTrue(o->eval(env)))
        {
            return new Number(0); // false
        }
    }
    return new Number(1); // true
}


できた!。
※「SICPを読もう」の目次はこちら


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