2

我一直在寻找一段时间,但我找不到合适的问题,所以我会发布它。我希望那还没有发布。

我明白什么设置!做,但我不明白为什么要设置!可以修改let的局部变量并永久保留该值。例如:

(define count
  (let ((cont 0))
    (lambda ()
      (set! cont (+ cont 1))
      cont)))

如果我们多次评估(计数) ,我们会看到结果是

> (count)
1
> (count)
2
> (count)
3
> 

... 等等。但是,据我了解,cont是一个局部变量,那么为什么要保留该值呢?为什么每次调用函数时都不设置为0?

好吧,那就是:) 提前致谢!

PS:对不起,我的英语 *o*

4

1 回答 1

5

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

为了比较,看看具有真正局部变量的过程的外观:

(define count
  (lambda ()
    (let ((cont 0))
      (set! cont (+ cont 1))
      cont)))

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

于 2013-08-27T16:52:53.740 回答