我有一段非常简单的代码我只是想跟随流程,我想我理解但我只是想确保
(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)))它实际上也不会回到零?
答案 0 :(得分:2)
你的直觉是正确的。这一部分:(let ([next 0])
只执行一次,之前 lambda
绑定到名称count
- 这是因为第一个let
返回为其值它的最后一个表达式,恰好是lambda
,这就是变量count
的绑定。
函数定义结束后,count
过程的实际执行从这一行开始:(let ([v next])
,每次调用过程时都会发生这种情况。 next
过程的所有调用都相同的count
变量可在count
内访问,因为它是作为lambda
环境的一部分捕获的它的创建时间,在封闭内。