定义一个函数来调用嵌套函数

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)。