2016-10-22 101 views
0

我一直在努力通过在线方式的教程和感到困惑的下面的代码:定义一个函数来调用嵌套函数

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

那为什么帐户2不从通话累计余额打电话,而account1呢?例如:

(account1 5) 
-> Dong 
;Value: 15 

(account1 10) 
-> Dong 
;Value: 25 

(account2 5) 
-> DingDong 
;Value: 15 

(account2 10) 
-> DingDong 
;Value: 20 

我一直在使用“鼎”和“冬”测试的代码后发现,在调用时帐户1“鼎”从不显示,同时呼吁双方帐户2“鼎”和“东”被显示。我相信这与这个问题是一致的。提前致谢!

回答

0

在代码中,你要创建一个新的功能每次调用它的时候,因为你返回功能包括一个新的呼叫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)))) 

注意如何返回函数(第二拉姆达)已经预置了my-account,只需一个电话到make-bank-account。然后,创建一个新帐户:

> (define account3 (new-account 20)) 
Ding 
> (account3 30) 
Dong50 
> (account3 30) 
Dong80 
> 
1

由于没有帐户可累积,因此金额不会累积。

综观定义,

(define account2 
    (lambda (x) 
    ((make-bank-account 10) x))) 

account2是一个函数,

  • 注意到的量x
  • 创建帐户余量10
  • 存款给定金额为x纳入新创建的帐户

它创建的帐户永远不会存储在任何地方,所以没有更多的事情可以发生在它。

也就是说,每当你说(account2 5) - 相当于((make-bank-account 10) 5) - 一个新的帐户被创建(丁),并且5个单位被存入那(董)。