方案:为什么'设置'!修改'let'的局部变量?

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*

Ósc*_*pez 5

发生这种情况是因为count创建了一个"存储"值的闭包,cont即使在过程调用之间也会记住它的值.请注意,定义为变量后将lambda分配给count名称,并在此过程中将其关闭.它不再是一个局部变量,它是一个在过程外定义的变量,在所有调用之间共享,"记住"它在上次调用时的值.contlambdacont

为了进行比较,请查看具有真正局部变量的过程如何:

(define count
  (lambda ()
    (let ((cont 0))
      (set! cont (+ cont 1))
      cont)))
Run Code Online (Sandbox Code Playgroud)

以上将始终返回1,将其与问题中的过程进行比较.