gpt4 book ai didi

oop - 对这个 "oop under-the-hood"计数器示例如何工作感到非常困惑

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

这是 make-counter 过程和对它的调用

(define make-counter
(let ((glob 0))
(lambda ()
(let ((loc 0))
(lambda ()
(set! loc (+ loc 1))
(set! glob (+ glob 1))
(list loc glob))))))

> (define counter1 (make-counter))
counter1

> (define counter2 (make-counter))
counter2

> (counter1)
(1 1)

> (counter1)
(2 2)

> (counter2)
(1 3)

> (counter1)
(3 4)

我不明白为什么 glob 表现为类变量,而 loc 表现为实例变量。

最佳答案

代码的每个部分何时运行可能是最容易考虑的。你评价

(define make-counter (let ((0 glob)) ...))

只有一次,所以 let 只被评估一次。这意味着只有一个 绑定(bind),并且它的值由let 主体内的所有内容共享。现在,let 的主体是什么?这是一个 lambda 函数,它成为 ma​​ke-counter 的值:

(lambda ()          ; this function is the value of make-counter

(let ((loc 0)) ; so this stuff gets execute *each time* that
(lambda () ; make-counter is called
... ;
))) ;

现在,每次您调用 ma​​ke-counter 时,您都会评估(let ((loc 0)) (lambda () …)),它创建一个新绑定(bind)并返回一个可以访问它(以及从外部访问全局绑定(bind))的 lambda 函数。

因此调用 ma​​ke-counter 的每个结果都可以访问 glob单个绑定(bind),以及访问一个 per- loc 的结果绑定(bind)。

关于oop - 对这个 "oop under-the-hood"计数器示例如何工作感到非常困惑,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/31733160/

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