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

时间:2013-08-27 16:41:42

标签: count scheme set let

我已经搜索了一段时间,我找不到合适的问题,所以我会发布它。我希望不会发布。

我理解 set!做什么,但我不明白为什么 set!可以修改一个局部变量并永远保持价值。例如:

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

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

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

......等等。但是,据我所知, cont 是一个局部变量,为什么它保持这个值呢?为什么每次调用函数时都没有设置为0?

嗯,那是:) 提前谢谢!

PS:请原谅我的英语* o *

1 个答案:

答案 0 :(得分:5)

这是因为count正在创建closure“存储”cont的值,并且即使在过程调用之间也会记住它的值。请注意,在将lambda定义为变量之后,count已分配给cont名称​​,并且这样做lambda将关闭{{1} }}。它不再是 local 变量,它是一个在过程外定义并在所有调用之间共享的变量,“记住”它在上次调用时的值。

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

cont

以上总是返回(define count (lambda () (let ((cont 0)) (set! cont (+ cont 1)) cont))) ,将其与问题中的程序进行比较。