2016/02/10
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))