我正在努力完成 SICP。我在第3.1.1节 http://mitpress.mit.edu/sicp/full-text/book/book-Z-H-20.html并查看当地状态。我正在 GNU Guile v2.0.11 中评估这些练习。
我确实找到了一个关于本节的类似问题 https://stackoverflow.com/questions/26696927/local-state-of-a-variable,但这似乎没有解决我正在努力解决的问题,或者我太迟钝了。
我正在看的两个例子是:
(define new-withdraw
(let ((balance 100))
(lambda (amount)
(if (>= balance amount)
(begin (set! balance (- balance amount))
balance)
"Insufficient funds"))))
(define (make-withdraw balance)
(lambda (amount)
(if (>= balance amount)
(begin (set! balance (- balance amount))
balance)
"Insufficient funds")))
当我将第一个分配给变量时:
(define a new-withdraw)
(define b new-withdraw)
我得到两个指向同一个过程对象的指针,并且状态在它们之间共享:
scheme@(guile-user)> a
$1 = #<procedure 1165880 at /path/to/file (amount)>
scheme@(guile-user)> b
$2 = #<procedure 1165880 at /path/to/file (amount)>
scheme@(guile-user)> (a 50)
$3 = 50
scheme@(guile-user)> (b 10)
$4 = 40
然而,当我实现第二个过程时,我得到了指向两个具有不同状态的不同过程对象的指针:
scheme@(guile-user)> (define c (make-withdraw 100))
scheme@(guile-user)> (define d (make-withdraw 100))
scheme@(guile-user)> c
$5 = #<procedure 14fdac0 at /path/to/file (amount)>
scheme@(guile-user)> d
$6 = #<procedure 1508360 at /path/to/file (amount)>
scheme@(guile-user)> (c 50)
$7 = 50
scheme@(guile-user)> (d 10)
$8 = 90
我已通读该部分,但对此没有明确的解释,并且当我搜索该部分时我无法找到任何内容。我了解一般状态方面发生的情况,但我不明白这些过程之间的区别是什么,允许一个拥有单一的通用状态,另一个保持本地状态。
为什么第一个定义“new-withdraw”无法跨多个分配维护本地状态?每次我们进行不同的分配(定义 new-withdraw)时,lambda 似乎都应该捕获余额为 100 的分配。