为什么scheme找到一个用"define"定义的变量而不是"let"

jgo*_*gon 2 scheme scope

所以这是关于方案变量绑定的问题.假设我有以下功能:

(define undefinedTest (lambda (y) (list x y)))
Run Code Online (Sandbox Code Playgroud)

当在Guile-Scheme 2.0.3中运行时,这将警告x是未绑定的变量.如果我然后执行以下语句

> (let ((x 'something)) (undefinedTest 'else))
Run Code Online (Sandbox Code Playgroud)

我将得到一个错误和调试它的选项.但是,如果我执行以下语句:

> (define x 'something)
> (undefinedTest 'else)
Run Code Online (Sandbox Code Playgroud)

我得到了预期的答案(别的).为什么scheme在顶层定义时能够绑定x,而不是在let绑定时绑定x.这是因为当定义函数时它也定义在顶层,因此当方案去搜索其最近的封闭环境时,let环境实际上并没有"封闭",因为它仍然在"top-"开始搜索水平"?

Chr*_*ung 5

Scheme使用词法范围,而不是动态范围.所以,xundefinedTest看到是x是从那个函数,在这种情况下,因为你已经注意到,是顶级的范围词法可见.