2013-01-13 29 views
3

請考慮2個Scheme功能定義方案的功能,是有區別

; Define function 
(define (square n) (* n n)) 
(square 12) 
144 

; Another way to define same function 
(define square (lambda (n) (* n n))) 
(square 12) 
144 

似乎都產生相同的結果。

這些函數聲明之間是否有任何功能差異?在某些情況下應該優先於另一個嗎?

回答

4

這兩個定義之間沒有區別 - 前者是後者的語法糖。

你更喜歡哪一個是一個風格問題,但我的印象是,前者通常是定義函數的首選方式,因爲它更簡潔一些,也許更具可讀性。

介紹性文本經常使用後者來清楚地說明一個命名的函數只是一個持有lambda的變量 - 這在使用第一個變體時並不明顯。

+1

確實!當我第一次看到第一個聲明時,我明白它是一個函數聲明。一個認爲它是一個變量聲明持有拉姆達沒有發生在我身上。謝謝。 – JAM

1

sepp2k絕對正確,因爲您定義的兩個過程是相同的。在這樣的簡單程序定義中,要麼是正確的,要麼歸結爲一個偏好問題。

使用明確的lambda語句有意義的一種情況是,如果您需要跟蹤過程中的某種狀態。例如,我們可以這樣做一個計數器:

(define counter 
    (let ((count 0)) 
     (lambda() 
      (set! count (+ count 1)) 
      count))) 

(counter) ;=> 1 
(counter) ;=> 2 
(counter) ;=> 3