やっと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
}