https://github.com/takeisa/uschemer/tree/v0.12
スペシャルフォーム評価処理のクラス化
スペシャルフォーム毎に式を評価するクラスを作成した。
処理の概要は以下の通り。
スペシャルフォームの識別子と、それに対応する処理オブジェクトを定義する。
SP_FORM_EVAL = {
:lambda => LambdaEval.new,
:let => LetEval.new,
:letrec => LetrecEval.new,
:define => DefineEval.new,
:if => IfEval.new,
:cond => CondEval.new,
:and => AndEval.new,
:or => OrEval.new,
:not => NotEval.new
}
スペシャルフォームを評価する時は、識別子に対応する処理オブジェクトを、このハッシュオブジェクトより取得し、式を評価するevalメソッドを呼び出す。
参考として、if式を評価するクラスを示す。
class IfEval < BaseEval
def eval(exp, env, exp_eval)
test_form, then_form, else_form = if_to_test_then_else(exp)
if exp_eval.eval(test_form, env) then
exp_eval.eval(then_form, env)
else
exp_eval.eval(else_form, env)
end
end
def if_to_test_then_else(exp)
[exp[1], exp[2], exp[3]]
end
end
もっと良い構成にできそうだが、いくらか見通しが良くなったので、ここまでにしておこう。
S式のクラス化
プログラム中ではRubyのリストオブジェクトのまま扱っているので、
今のままでは、Consセルを実現できない。
こちらはConsセルが必要になるまで、後回しにしよう。
0 件のコメント:
コメントを投稿