(define self-add
(let ((x 0))
(lambda ()
(set! x (+ x 1))
x)))
(self-add)=> 1
(self-add)=> 2
(self-add)=> 3
(self-add)=> 4
(define self-add1
(lambda ()
(let ((x 0))
(set! x (+ x 1))
x)))
(self-add1)=> 1
(self-add1)=> 1
(self-add1)=> 1
请告诉我如何理解上述两个功能之间的区别? 非常感谢提前! 最好的问候。
答案 0 :(得分:5)
第一个函数定义一个局部变量x
,初始值为0
,之后将一个lambda特殊形式绑定到名称self-add
- 所以{ {1}}由lambda“封闭”(这就是为什么我们说lambda表现为closure)并且{em>相同用于x
的所有调用(你可以说self-add
被x
“记住”,每次调用时self-add
的值都会增加一。
第二个函数将lambda绑定到过程,然后 在lambda中定义一个局部变量x
- 每次x
获取x
时重新定义self-add1
对于所有调用,将调用 :所以x
永远不会被self-add1
“记住”,并且每次调用过程时都会重新创建0
,并使用{{1}进行初始化然后递增,始终返回值1
。
答案 1 :(得分:1)
第一个功能是闭包。您可以在函数的词法范围中创建x
变量,并且变量在调用之间保持其值。
其他信息:
答案 2 :(得分:0)
第一个函数是一个闭包,而第二个函数每次只返回相同的函数,这使x = 0然后加一个并返回结果。