定义一个函数来调用嵌套函数
Defining a function to call nested functions
我一直在学习在线方案教程,对以下代码感到困惑:
(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" 和 "Dong" 测试了代码,并注意到在调用 account1 时从未显示 "Ding" 而在调用 account2 时 "Ding" 和 "Dong" 显示。我相信这与问题相对应。提前致谢!
在您的代码中,您每次调用时都会创建一个 new 函数,因为您 return 的函数包含 一个新调用 到 make-bank-account
。如果稍微更改为:
(define account2
(lambda (x)
(account1 x)))
显然你会得到正确的功能。然而,account1
调用 make-bank-account
并使用函数 returned,当您重复调用它时 "holds" 占位符具有正确的值。
要显示差异,您可以 "remember" 您创建的帐户。这基本上是相同的原始代码:
(define new-account
(lambda (initial-amount)
(define my-account (make-bank-account initial-amount))
(lambda (amount)
(my-account amount))))
请注意您 return(第二个 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)
– 相当于 ((make-bank-account 10) 5)
– 创建一个新帐户(Ding),并存入 5 个单位(Dong)。
我一直在学习在线方案教程,对以下代码感到困惑:
(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" 和 "Dong" 测试了代码,并注意到在调用 account1 时从未显示 "Ding" 而在调用 account2 时 "Ding" 和 "Dong" 显示。我相信这与问题相对应。提前致谢!
在您的代码中,您每次调用时都会创建一个 new 函数,因为您 return 的函数包含 一个新调用 到 make-bank-account
。如果稍微更改为:
(define account2
(lambda (x)
(account1 x)))
显然你会得到正确的功能。然而,account1
调用 make-bank-account
并使用函数 returned,当您重复调用它时 "holds" 占位符具有正确的值。
要显示差异,您可以 "remember" 您创建的帐户。这基本上是相同的原始代码:
(define new-account
(lambda (initial-amount)
(define my-account (make-bank-account initial-amount))
(lambda (amount)
(my-account amount))))
请注意您 return(第二个 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)
– 相当于 ((make-bank-account 10) 5)
– 创建一个新帐户(Ding),并存入 5 个单位(Dong)。