我试图根据Harold Abelson和Gerald Jay Sussman着名的书籍“结构和计算机程序的解释”在计划中实现Metacircular Evaluator。Metacircular evaluation,implementation the environment
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默认将变量传递给函数,因此在两次将“define-variable!”应用于initial之后-env,initial-env不会每次都被更改,并且setup-environment函数将在extend-environment返回值时返回值。
我的理解错误在哪里,请问您能提供意见吗?
预先感谢您!
是的,很多人认为语言不是“按价值传递”,当他们真的是时,他们只是“按价值传递参考”。 – 2012-03-16 22:36:38
非常感谢!你说得对,我的问题不是很准确,请原谅,请原谅。下一次会更清楚。 – 2012-03-17 11:07:19