我一直在研究在线计划教程,并对以下代码感到困惑:
(define make-bank-account
(lambda (balance)
(display "Ding")
(lambda (n)
(display "Dong")
(set! balance (+ balance n))
balance)))
(define account1 (make-bank-account 10))
;; My code
(define account2
(lambda (x)
((make-bank-account 10) x)))
为什么account2不会在来电之间累积余额,而account1呢?例如:
(account1 5)
-> Dong
;Value: 15
(account1 10)
-> Dong
;Value: 25
(account2 5)
-> DingDong
;Value: 15
(account2 10)
-> DingDong
;Value: 20
我使用" Ding"测试了代码。和"董"并注意到在调用account1" Ding"在调用account2时不会显示"丁"和"董"显示。我相信这与问题相符。提前谢谢!
答案 0 :(得分:1)
在您的代码中,您每次调用时都会创建新功能,因为您返回的功能包括新呼叫到make-bank-account
。如果你稍微改为:
(define account2
(lambda (x)
(account1 x)))
显然你会得到正确的功能。但是,account1
会调用make-bank-account
并使用返回的函数,当您重复调用它时,它会“保留”具有正确值的占位符。
要显示差异,您可以“记住”您创建的帐户。这基本上与原始代码相同:
(define new-account
(lambda (initial-amount)
(define my-account (make-bank-account initial-amount))
(lambda (amount)
(my-account amount))))
注意你返回的函数(第二个lambda)是如何初始化my-account
的,只需要调用make-bank-account
。然后,创建一个新帐户:
> (define account3 (new-account 20))
Ding
> (account3 30)
Dong50
> (account3 30)
Dong80
>
答案 1 :(得分:1)
金额不会累积,因为没有帐户累积到。
看看定义,
(define account2
(lambda (x)
((make-bank-account 10) x)))
account2
是一个
x
x
存入新创建的帐户它创建的帐户永远不会存储在任何地方,因此不会再发生这种情况。
也就是说,每当你说(account2 5)
- 相当于((make-bank-account 10) 5)
时,就会创建一个新帐户(丁),并将5个单位存入(东)。