我发现检查范围是词法还是动态的程序是下面给出的程序(来源:http://inst.eecs.berkeley.edu/~cs61a/su10/resources/sp11-Jordy/scope/)
(define test
(let ((scope 'lexical))
(lambda () scope)))
(let ((scope 'dynamic))
(test))
但这怎么能行呢?这应该总是打印 'lexical (无论范围是词法还是动态)对吗?因为在第一个'let'主体的本地范围内,范围总是定义为'词法..如果我错了,请纠正我
最佳答案
test
的值不是
(let ((scope 'lexical))
(lambda () scope))
这只是
(lambda () scope)
当您调用它时,
(test)
,函数体被评估,它只包括scope
对于词法范围,这将是在评估定义时有效的绑定(bind)中的值,即词法封闭
let
-捆绑。使用动态范围,
scope
的绑定(bind)在调用函数之前不会查找。当时绑定(bind)到
'lexical
早已不复存在——它只存在于 test
的定义中.当你
(let ((scope 'dynamic))
(test))
在环境中引入了一个新的绑定(bind),这是在查找
scope
时找到的绑定(bind).类似的功能
(define test
(lambda ()
(let ((scope 'whatever))
scope)))
会按照你建议的方式工作——总是返回
'whatever
— 作为对 'whatever
的绑定(bind)在评估 scope
期间生效即使在动态环境中。
关于scope - 检查范围是词法还是动态的程序,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/32344615/