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

时间:2016-10-22 08:39:08

标签: 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 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时不会显示"丁"和"董"显示。我相信这与问题相符。提前谢谢!

2 个答案:

答案 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
  • 使用余额10
  • 创建帐户
  • 将给定金额x存入新创建的帐户

它创建的帐户永远不会存储在任何地方,因此不会再发生这种情况。

也就是说,每当你说(account2 5) - 相当于((make-bank-account 10) 5)时,就会创建一个新帐户(丁),并将5个单位存入(东)。