関数型言語の勉強に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というクラスにしました。
計算機プログラムの構造と解釈
posted with amazlet on 06.05.31