为什么 make-counter 过程包含两个 lambda 定义?

Why does make-counter procedure contains two lambda definition?

我正在尝试了解 make-counter 程序的方案代码。这是一个高阶过程(一个过程输出另一个过程),我坚持使用它。

(define make-counter
  (lambda (n)
    (lambda () 
      (set! n (+ n 1))
      n)))

(define ca (make-counter 0))
(ca)
(ca)

这将按预期分别输出 1 和 2。为什么我们在这里需要 2 个嵌套过程?它们各自的作用是什么?

如果有人详细解释,我将不胜感激。以后谢谢了。

正确缩进,这是:

(define make-counter
  (lambda (n)
    (lambda ()
      (set! n (+ n 1))
      n)))

顺便说一下,您可以使用不同的语法:

(define (make-counter n)
  (lambda ()
    (set! n (+ n 1))
    n))

make-counter 是一个函数,它接受一个数字 n 和 returns 一个名为 closure 的对象,它的行为类似于一个函数,但包含一个状态。 make-counter 的不同调用将产生不同的闭包,即使在参数中给出相同的 n 也是如此。正如您所试验的,可以使用函数调用语法调用闭包。

当您调用闭包时,将执行其中包含的代码。在您的示例中,闭包接受零参数,并改变名为 n 的变量。同样,从 n 到值的绑定对于闭包是本地的,并且对于所有计数器实例都是不同的。但是在一个特定的计数器中,n 总是指向相同的内存位置。

调用 set! 函数会更改 n 的计算结果,并用 (+ n 1) 替换先前的值,增加局部计数器变量。