2016-10-22 97 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個單位被存入那(董)。