関数型言語の勉強に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 }
計算機プログラムの構造と解釈
posted with amazlet on 06.05.31