SICP 読み (360) 5.5 翻訳系
なんとか 400 回を迎えない間に終了したいんですがどうなる事やら。
問題 5.48
リスト修行からヤリ直した方が良さげ。とりあえず原因としては
;;; EC-Eval input: (compile-and-run '(define (fact n) (if (= n 1) 1 (* n (fact (- n 1))))))
で受けた式を
ev-compile-and-run (assign val (op compile->assemble) (reg exp)) ; (assign continue (label print-result)) (goto (reg val))
で全部 compile->assemble に渡して
(define (compile->assemble exp) (assemble (statements (compile (cadr exp) 'val 'return)) eceval))
の中で cadr で取り出したら quoted なオブジェクトになっていた、というのが敗因。渡した式をそのまま戻す手続きができあがって戻ってきていた、と。
とりあえずな対処として
ev-compile-and-run (assign val (op procedure-parameters) (reg exp)) ;; cadr (assign val (op compile->assemble) (reg val)) ; (assign continue (label print-result)) (goto (reg val))
みたいにして差し上げたら正常動作。でもちょっとオチてない自分がおります。