我正在试图理解制造计数器程序的方案代码.这是一个更高阶的程序(程序输出另一个程序),我坚持下去.
(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
并返回一个名为closure的对象的函数,该对象的作用类似于函数但包含一个状态.不同的调用 make-counter
会产生不同的闭包,即使n
在论证中给出相同的闭包.在您进行实验时,可以使用函数调用语法调用闭包.
当您调用闭包时,将执行其中包含的代码.在您的示例中,闭包接受零参数,并更改名为的变量n
.同样,从n
值到绑定的绑定对于闭包是本地的,对于所有计数器实例都是不同的.但在特定计数器内部,n
始终引用相同的内存位置.
对set!
函数的调用会更改n
求值的内容,并将前一个值替换为(+ n 1)
递增本地计数器变量.