War*_*ren 2 scheme count set let
我一直在寻找一段时间,我找不到合适的问题,所以我会发布它.我希望不会发布.
我明白了什么!并且让做,但我不明白为什么设置!可以修改let的局部变量并永远保持该值.例如:
(define count
(let ((cont 0))
(lambda ()
(set! cont (+ cont 1))
cont)))
Run Code Online (Sandbox Code Playgroud)
如果我们多次评估(计数),我们会看到结果是
> (count)
1
> (count)
2
> (count)
3
>
Run Code Online (Sandbox Code Playgroud)
... 等等.但是,据我所知,cont是一个局部变量,为什么它保持价值呢?为什么每次调用函数时都没有设置为0?
好吧,那就是:)先谢谢!
PS:请原谅我的英语*o*
发生这种情况是因为count
创建了一个"存储"值的闭包,cont
即使在过程调用之间也会记住它的值.请注意,在定义为变量后将其lambda
分配给count
名称,并在此过程中将其关闭.它不再是一个局部变量,它是一个在过程外定义的变量,在所有调用之间共享,"记住"它在上次调用时的值.cont
lambda
cont
为了进行比较,请查看具有真正局部变量的过程如何:
(define count
(lambda ()
(let ((cont 0))
(set! cont (+ cont 1))
cont)))
Run Code Online (Sandbox Code Playgroud)
以上将始终返回1
,将其与问题中的过程进行比较.