SICP 問題 5.48
ECEVALのrepl上でコンパイル出来るようにする.
これで動くかなって思ったら動いた.
ただトレースした命令列を見ると,
apply-dispatchからprimitive-procedureにジャンプせずに先頭に戻っている.
なぜそうなるのかわからない.
;; 環境を拡張してprimitive-procedureとしてcompile-and-run を登録 (define (setup-environment-with-compile) (extend-environment (list 'compile-and-run) (list (list 'primitive compile-and-run)) (setup-environment))) ;; setup-environment-with-compileの環境からecevalに入るようにする (define (compile-and-go expression) (let ((instructions (assemble (statements (compile expression 'val 'return '())) eceval))) (set! the-global-environment (setup-environment-with-compile)) (set-register-contents! eceval 'val instructions) (set-register-contents! eceval 'flag true) (start eceval))) ; ; and-goとは違い環境の初期設定はいらない. (define (compile-and-run expression) (let ((instructions (assemble (statements (compile expression 'val 'return '())) eceval))) (set-register-contents! eceval 'val instructions) (set-register-contents! eceval 'flag true) (start eceval))) ;; 環境をwith-compileのほうにしてflagをfalseにしてからecevalに入る. (define (start-eceval) (set! the-global-environment (setup-environment-with-compile)) (set-register-contents! eceval 'flag false) (start eceval))