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

时间:2017-01-09 08:22:42

标签: scheme closures lisp counter

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

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

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

分别按预期输出1和2。为什么我们需要2个嵌套程序?它们的功能分别是什么?

如果有人详细解释,我将不胜感激。谢谢你们。

1 个答案:

答案 0 :(得分:5)

缩进正确,这是:

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

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

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

make-counter是一个函数,它接受一个数字n并返回一个名为 closure 的对象,该对象的作用类似于一个函数但包含一个状态。即使在参数中给出相同的make-countern的不同调用也会产生不同的闭包。在您进行实验时,可以使用函数调用语法调用闭包。

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

set!函数的调用会更改n求值的内容,并将前一个值替换为(+ n 1),从而递增本地计数器变量。