2012-07-01 48 views
1
  1. (define self-add 
    (let ((x 0)) 
        (lambda() 
        (set! x (+ x 1)) 
        x))) 
    

(自加)=> 1這兩個Scheme函數有什麼區別?

(自加)=> 2

(自加)=> 3

( self-add)=> 4

    2.
(define self-add1 
    (lambda() 
     (let ((x 0)) 
     (set! x (+ x 1)) 
     x))) 

(個體ADD1)=> 1

(個體ADD1)=> 1

(個體ADD1)=> 1

請告訴我如何理解上述兩個函數的區別? 非常感謝! 此致敬禮。

+1

你有沒有嘗試*使用*這些功能,看看他們做什麼? –

+0

該怎麼辦?謝謝 – abelard2008

回答

5

第一個函數定義了一個局部變量x0的初始值和事後結合一個lambda特殊形式的名稱self-add - 所以x被「封閉」由氧(這就是爲什麼我們說的拉姆達從表現爲closure),並將會爲self-add所有調用的相同(你可以說x被「記住」通過self-add),並且每次被調用的x值時間將由一個遞增。

第二個功能結合的拉姆達的程序和事後定義了一個局部變量x拉姆達內 - 這裏x每次self-add1被稱爲重新定義,並將成爲所有調用不同:所以x從來都不是「記住」self-add1並且每次調用該過程時重新創建,使用0進行初始化,然後遞增,總是返回值1

+0

感謝您的詳細解釋! – abelard2008

+0

@ abelard20008我的榮幸!歡迎來到Stack Overflow,請記住通過點擊左邊的複選標記接受對您最有幫助的答案。 –

+0

我可以認爲第二個函數中的x是局部變量嗎?謝謝 – abelard2008

0

第一功能是關閉,而第二功能簡單地返回每次相同的功能,這使得x = 0和然後添加一個並返回結果。

+0

從哪裏可以得到Scheme關閉的知識,我在「The Scheme programming language 4th edition」一書中沒有找到任何關於這方面的內容,謝謝! – abelard2008

+0

我建議您閱讀[SICP](http://mitpress.mit.edu/sicp/)。它是免費的,是一本非常好的計算機科學書籍,恰好使用Scheme。它也包括關閉的使用。祝你好運。 –