Harold Abelson と Gerald Jay Sussman による有名な本「Structure and Interpretation of Computer Programs」に従って、Scheme に Metacircular Evaluator を実装しようとしています。
http://mitpress.mit.edu/sicp/full-text/sicp/book/node79.html、http://mitpress.mit.edu/sicp/full-text/sicp/book/node80.html
著者は、次の方法で環境をセットアップすることを提案しています。
(define (define-variable! var val env)
(let ((frame (first-frame env)))
(define (scan vars vals)
(cond ((null? vars)
(add-binding-to-frame! var val frame))
((eq? var (car vars))
(set-car! vals val))
(else (scan (cdr vars) (cdr vals)))))
(scan (frame-variables frame)
(frame-values frame))))
(define (setup-environment)
(let ((initial-env
(extend-environment (primitive-procedure-names)
(primitive-procedure-objects)
the-empty-environment)))
(define-variable! 'true true initial-env)
(define-variable! 'false false initial-env)
initial-env))
ただし、理由がわかりません
(define myenv (setup-environment))
私が知っているように、Scheme はデフォルトで値によって関数に変数を渡すため、Scheme で期待どおりに動作するはずです。initial-env に変更すると、initial-env は毎回変更されず、setup-environment 関数は、extend-environment が返した値を返します。
私の理解のどこが間違っていますか、教えていただけますか?
前もって感謝します!