scope - 检查范围是词法还是动态的程序

标签 scope scheme racket

我发现检查范围是词法还是动态的程序是下面给出的程序(来源: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/

相关文章:

ruby-on-rails - 按父属性排序的 Rails 作用域顺序

python - 更改列表的元素与更改列表本身

recursion - 试图理解方案中的 "let"

macros - 在 scheme 中定义 goto

functional-programming - 函数式程序——写一个函数从中间重新排列一个数组

scheme - 包括来自 Racket /方案中的文件

c++ - 访问必须在 if 语句内进行的 int

c++ - 将 C++ new 运算符与函数一起使用的明智方法是什么?

lisp - 使用方案中的列表

scheme - 通过数字列表进行过滤