我已经搜索了一段时间,我找不到合适的问题,所以我会发布它。我希望不会发布。
我理解 set!和让做什么,但我不明白为什么 set!可以修改一个局部变量让并永远保持价值。例如:
(define count
(let ((cont 0))
(lambda ()
(set! cont (+ cont 1))
cont)))
如果我们多次评估(count),我们会看到结果是
> (count)
1
> (count)
2
> (count)
3
>
......等等。但是,据我所知, cont 是一个局部变量,为什么它保持这个值呢?为什么每次调用函数时都没有设置为0?
嗯,那是:) 提前谢谢!
PS:请原谅我的英语* o *
答案 0 :(得分:5)
这是因为count
正在创建closure“存储”cont
的值,并且即使在过程调用之间也会记住它的值。请注意,在将lambda
定义为变量之后,count
已分配给cont
名称,并且这样做lambda
将关闭{{1} }}。它不再是 local 变量,它是一个在过程外定义并在所有调用之间共享的变量,“记住”它在上次调用时的值。
为了进行比较,请查看具有真正局部变量的过程的外观:
cont
以上总是返回(define count
(lambda ()
(let ((cont 0))
(set! cont (+ cont 1))
cont)))
,将其与问题中的程序进行比较。