基于SICP的求值环境模型,词法作用域和动态作用域的区别

11

在SICP的3.2.2节中,执行以下代码片段:

(define (square x)
  (* x x))
(define (sum-of-squares x y)
  (+ (square x) (square y)))
(define (f a)
  (sum-of-squares (+ a 1) (* a 2)))

(f 5)

这个图解可通过此链接查看。

每次函数被调用时,都会创建一个新的帧(由E1E4标记),表示符号和值之间的绑定关系。当在帧中没有找到符号的绑定时,就会查询该帧的封闭环境以获取特定符号的绑定。

有趣的是,图中所有标记为E的帧都包含在全局环境中。文本说明这是因为函数是在全局环境中定义的,但并未详细介绍此问题:

请注意,由square创建的每个帧都指向全局环境,因为这是由square过程对象指示的环境。

如果帧是包含在调用函数的环境中,例如E3包含在E2中,后者又包含在E1中,那么这是否是动态作用域语言工作方式的有效模型?此外,图中帧具有相同的“父”环境是因为Scheme具有词法作用域吗?

1个回答

6
两个问题的答案都是“是”。SICP中的那一章在没有使用该术语的情况下解释了词法作用域。按照您所描述的方式更改评估机制将创建动态范围模型。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接