gpt4 book ai didi

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

转载 作者:太空宇宙 更新时间:2023-11-03 18:56:34 25 4
gpt4 key购买 nike

我正在尝试理解 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 并返回一个名为 closure 的对象,它的行为类似于一个函数,但包含一个状态。不同的 make-counter 调用将产生不同的闭包,即使在参数中给出相同的 n 也是如此。正如您所试验的,可以使用函数调用语法调用闭包。

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

调用 set! 函数会改变 n 的计算结果,并用 (+ n 1) 替换之前的值,递增本地计数器变量。

关于scheme - 为什么 make-counter 过程包含两个 lambda 定义?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/41545457/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com