2

我有一段非常简单的代码,我只是想遵循流程,我想我理解,但我只是想确保

(define count
  (let ([next 0])
    (lambda ()
      (let ([v next])
        (set! next (+ next 1))
        v))))

基本上,count 会跟踪它被调用的次数。当您第一次调用它时,使用 let 将 next 设置为 0。稍后,使用 set! 将其更改为 1!我试图弄清楚为什么 (let ([next 0]) 每次调用程序时都没有将 next 设置回 0。据我所知, (lambda () ...) 是实际函数开始(不带参数),所以当您再次调用 count 时,它只是从那里执行,使用该范围内的 next 的值(集合!一个)

我想……老实说,我还是有点不确定。设置!只是自动永久更改 next 所以当你再次调用 count 时,即使第一行是 (let ((next 0))) 它实际上并没有回到零?

4

1 回答 1

2

你的直觉是正确的。这部分:在绑定到名称之前(let ([next 0])只执行一次- 这是因为第一个作为其值返回它的最后一个表达式,恰好是 a ,这就是绑定到变量的内容。lambdacountletlambdacount

函数定义结束后,count过程的实际执行从这一行开始:(let ([v next]),每次调用过程都会发生这种情况。该next变量对于count过程的所有调用都是相同的,可以在内部访问,count因为它在lambda创建时作为 ' 的环境的一部分在闭包内被捕获。

于 2012-11-18T04:03:47.223 回答