为什么 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)
替换先前的值,增加局部计数器变量。
我正在尝试了解 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)
替换先前的值,增加局部计数器变量。