在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)
这个图解可通过此链接查看。
每次函数被调用时,都会创建一个新的帧(由E1
到E4
标记),表示符号和值之间的绑定关系。当在帧中没有找到符号的绑定时,就会查询该帧的封闭环境以获取特定符号的绑定。
有趣的是,图中所有标记为E
的帧都包含在全局环境中。文本说明这是因为函数是在全局环境中定义的,但并未详细介绍此问题:
请注意,由
square
创建的每个帧都指向全局环境,因为这是由square
过程对象指示的环境。
如果帧是包含在调用函数的环境中,例如E3
包含在E2
中,后者又包含在E1
中,那么这是否是动态作用域语言工作方式的有效模型?此外,图中帧具有相同的“父”环境是因为Scheme具有词法作用域吗?