Scheme 定义调用嵌套函数的函数
我一直在学习在线方案教程,对以下代码感到困惑:Scheme 定义调用嵌套函数的函数,scheme,mit-scheme,Scheme,Mit Scheme,我一直在学习在线方案教程,对以下代码感到困惑: (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 accoun
(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
我已经使用“叮”和“咚”测试了代码,注意到当调用account1时,不会显示“叮”,而调用account2时,会同时显示“叮”和“咚”。我相信这正是问题所在。提前谢谢 在代码中,您每次调用它时都在创建一个新的函数,因为您返回的函数包括对
创建银行帐户
的新调用。如果将其稍微更改为:
(define account2
(lambda (x)
(account1 x)))
显然,你会得到正确的功能<但是,code>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
>
在代码中,您每次调用它时都在创建一个新的函数,因为您返回的函数包括对
创建银行帐户
的新调用。如果将其稍微更改为:
(define account2
(lambda (x)
(account1 x)))
显然,你会得到正确的功能<但是,code>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
>
由于没有可累积的账户,因此金额不会累积 从定义上看,
(define account2
(lambda (x)
((make-bank-account 10) x)))
account2
是一个
- 取一个金额
x
- 创建一个余额为10的新帐户
- 将给定金额
存入新创建的帐户x
也就是说,每次你说
(account2 5)
——这相当于((创建银行账户10)5)
——就会创建一个新账户(丁),并将5个单位存入该账户(侗)。由于没有可累积的账户,因此金额不会累积
从定义上看,
(define account2
(lambda (x)
((make-bank-account 10) x)))
account2
是一个
- 取一个金额
x
- 创建一个余额为10的新帐户
- 将给定金额
存入新创建的帐户x
(account2 5)
——这相当于((创建银行账户10)5)
——就会创建一个新账户(叮),并将5个单位存入该账户(叮)