方案 - 使用集!更改变量

时间:2012-11-18 03:58:31

标签: scope scheme

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

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

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

我想......我老实说还是有点不确定。确定了!只是自动改变下一个永久性,所以当你再次调用count时,即使第一行是(let((next 0)))它实际上也不会回到零?

1 个答案:

答案 0 :(得分:2)

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

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