不。蹦床和Y组合器可以使用闭合装置。
动态范围没有闭包,因此引用自由变量的过程/函数意味着程序的调用堆栈中具有该名称的任何变量。
在词法范围中,它是创建lambda时捕获的变量。因此代码:
(define test 10)
(define (make-adder test)
(lambda (v) (+ test v)))
(define add20 (make-adder 20))
(add20 5)
; ==> 25 in lexical scope
; ==> 15 in dynamic scope
</code>
共鸣很简单。函数返回的函数
make-adder
存储价值
20
如
test
,在动态范围内
test
是最接近的是什么,所以它是局部变量
10
。同时致电:
(let ((test 30))
(add20 5))
; ==> 25 in lexical scope
; ==> 35 in dynamic scope
</code>
现在Common Lisp具有动态范围和词法范围。动态范围的变量是在顶级定义的变量
defvar
,
defparameter
或宣布特别。这很容易出错,我们对这些变量使用了特殊的命名
earmuffs
。
Scheme具有可变对象的参数,并且存在用于更新和恢复它的语法,以便它将充当动态变量。
的
编辑
</强>
我已经测试了你的词法和动态lisp,两者似乎都按预期工作。