-
(define self-add (let ((x 0)) (lambda () (set! x (+ x 1)) x)))
(自行添加)=> 1
(自加)=> 2
(自行添加)=> 3
(自行添加)=> 4
- 2.
(define self-add1
(lambda ()
(let ((x 0))
(set! x (+ x 1))
x)))
(自加1) => 1
(自加1) => 1
(自加1) => 1
请告诉我如何理解上述两个功能之间的区别?提前非常感谢!此致敬意。
第一个函数定义了一个初始值为 0
的局部变量x
,然后将 lambda 特殊形式绑定到名称 self-add
- 所以x
被 lambda "封闭"(这就是为什么我们说 lambda 的行为是闭包),并且对于 self-add
的所有调用都是相同的(你可以说x
被 self-add
"记住"), 每次调用它时,x
的值都会增加 1。
第二个函数将 lambda 绑定到过程,然后在 lambda 内部定义一个局部变量x
- 在这里x
每次调用self-add1
时都会重新定义,并且对于所有调用都是不同的:所以x
永远不会被self-add1
"记住",并且每次调用过程时都会重新创建, 用 0
初始化,然后递增,始终返回值 1
。
第一个函数是闭包。在函数的词法范围内创建x
变量,变量在调用之间保存其值。
附加信息:
- http://en.wikipedia.org/wiki/Closure_(computer_science)
- 什么是词汇范围?
第一个函数是一个闭包,而第二个函数每次都简单地返回相同的函数,这使得 x = 0,然后加 1 并返回结果。