2016/02/02
SICP 問題 5.23
レジスタマシン上に実装した評価器でcondとletを実装する.
cond->ifのような構文変換器が機械演算として仮定してよいので,let->lambdaも使用する.
eval-dispatch
(test (op self-evaluating?) (reg exp))
(branch (label ev-self-eval))
(test (op variable?) (reg exp))
(branch (label ev-variable))
(test (op quoted?) (reg exp))
(branch (label ev-quoted))
(test (op assignment?) (reg exp))
(branch (label ev-assignment))
(test (op definition?) (reg exp))
(branch (label ev-definition))
(test (op if?) (reg exp))
(branch (label ev-if))
(test (op cond?) (reg exp)) ;cond?を追加
(branch (label ev-cond))
(test (op lambda?) (reg exp))
(branch (label ev-lambda))
(test (op let?) (reg exp))
(branch (label ev-let))
(test (op begin?) (reg exp))
(branch (label ev-begin))
(test (op application?) (reg exp))
(branch (label ev-application))
(goto (label unknown-expression-type))
ev-cond
(assign exp (op cond->if) (reg exp))
(goto (label eval-dispatch))
ev-let
(assign exp (op let->combination) (reg exp))
(goto (label eval-dispatch))