【发布时间】:2016-06-03 22:18:32
【问题描述】:
在评估和调用“set-variable-value!”时和'define-variable-value!',程序会将'env'传递给函数,在这两个函数中,'set!'只能修改函数内部的“env”;修改后的“env”也不会返回。
那么,如何更改“env”?
【问题讨论】:
在评估和调用“set-variable-value!”时和'define-variable-value!',程序会将'env'传递给函数,在这两个函数中,'set!'只能修改函数内部的“env”;修改后的“env”也不会返回。
那么,如何更改“env”?
【问题讨论】:
请记住,在本书的第 3.3 节 Modeling with Mutable Data 中,通过使用在函数名称后缀 ! 的约定引入了可变运算符,就像在 set-car! 中一样,它修改了 cons 单元的 car .
函数set-variable-value! 和define-variable-value! 只是修改传递的环境,因此不需要返回它。例如,set-variable-value! 是通过使用 set-car! 定义的:
(define (set-variable-value! var val env)
(define (env-loop env)
(define (scan vars vals)
(cond ((null? vars)
(env-loop (enclosing-environment env)))
((eq? var (car vars))
(set-car! vals val))
(else (scan (cdr vars) (cdr vals)))))
(if (eq? env the-empty-environment)
(error "Unbound variable -- SET!" var)
(let ((frame (first-frame env)))
(scan (frame-variables frame)
(frame-values frame)))))
(env-loop env))
请注意,作者在Chapter 4 的开头说:
我们的评估器实现的语言将是我们在本书中使用的 Lisp 的 Scheme 方言的一个子集。
由于引入的方言有副作用,实现它的最简单解决方案是在其解释器中也使用副作用。
【讨论】:
env 持有的值是一个指向对结构的指针,因此通过复制它,您有两个指向同一个底层结构的指针,并且使用一个指针对结构所做的更改将通过另一个指针看到。您可以将 Scheme 中的所有值都视为指向事物的指针,就像在 Python 中一样。