SICP:The Metacircular Evaluator中的'set'和'define'

时间:2016-06-03 22:18:33

标签: scheme sicp

评估并调用'set-variable-value!'时和'define-variable-value!',程序将'env'传递给函数,在这两个函数中,'set!'只能修改函数内部的'env';修改后的'env'也不会被返回。

那么,如何改变'env'?

1 个答案:

答案 0 :(得分:1)

请记住,在本书的第3.3节Modeling with Mutable Data中,引入了可变运算符,方法是使用!后缀函数名称的约定,如set-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方言方言的一部分。

由于引入的方言有副作用,实现它的最简单的解决方案是在其解释器中也使用副作用。