(wat-aro)

無職から有職者にランクアップしました

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