动态作用域下形式参数与自由变量同名时的求值问题咨询
动态作用域下参数与自由变量同名时的求值逻辑解答
嘿,这个问题确实很容易让人绕晕,我来帮你把动态作用域的规则理清楚,尤其是你举的这个例子!
首先得明确动态作用域和词法作用域的核心区别:
- 词法作用域(比如Scheme用的)是看函数定义时所在的环境,变量引用会找定义时周围的绑定;
- 动态作用域则是看函数调用时的活跃环境,变量引用会沿着调用栈往上找最近的那个绑定。
回到你的例子:
(define x 1) (define f (lambda (x) x) ) (f 2)
我们一步步走动态作用域下的求值流程:
- 首先在全局环境里,我们绑定了
x = 1,然后定义了函数f——它接受一个参数x,函数体就是返回x。 - 当调用
(f 2)时,会做两件事:- 为函数
f创建一个新的调用环境,在这个环境里把参数x绑定到传入的2(这个绑定是当前调用栈最顶层的); - 然后求值函数体里的
x:按照动态作用域规则,我们找当前活跃的、最近的x绑定,就是刚创建的x=2,所以最终返回2。
- 为函数
那为什么会有人说结果是1?大概率是对动态作用域的规则理解有误——他们可能误以为动态作用域会直接跳过函数的参数绑定,去全局找,但实际上函数的参数绑定是调用时环境的一部分,优先级比外层的同名变量更高。
简单总结一下:动态作用域下,变量查找是跟着调用栈走的,函数调用时创建的参数绑定会成为当前最优先的绑定,所以你的例子结果肯定是2。
内容的提问来源于stack exchange,提问作者Grim Oir-lee
相关产品推荐
相关产品推荐

