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))

みたいにして差し上げたら正常動作。でもちょっとオチてない自分がおります。