2012-01-11 37 views
8

我學習狡詐方案的那一刻,並在文檔中我突然跑進以下結構:何時使用帶有「裸」形式參數的lambda定義?

((lambda args (display args)) 42) 
=> (42) 

這扔我一個循環;直到這一點我已經假定形式參數總是封閉在一個列表:

((lambda (args) (display args)) 42) 
=> 42 

不知何時使用這種變型,以及如何從不同的點標記爲可變的參數個數。具體來說,就是以下兩個變體之間的區別:

((lambda args (display args)) 1 2 3)  => (1 2 3) 
((lambda (. args) (display args)) 1 2 3) => (1 2 3) 

是有區別 - 也許是更復雜的例子 - 我需要知道的,是沒有任何理由喜歡一個比其他?

+3

作爲獎勵,'list'的定義是'(define list(lambda xx))'。 – erjiang 2012-01-13 02:32:33

回答

6

不同的是,這個版本接收稱爲args一個參數,對案件有用,當你知道預期的lambda形式實際參數完全相同的號碼:

(lambda (args) (display args)) 

這個版本接收(可能空)列表參數,叫args,有用的,當你期待的lambda形式的可變數量的參數:

(lambda args (display args)) 

應該有以下兩個版本沒有什麼區別,但不是所有的翻譯將接受第二個,因爲它缺少點之前的部分(因此應儘量避免):

(lambda args (display args)) 
(lambda (. args) (display args)) 

以下版本有用的,當你要指定一個lambda形式有一個或多個強制參數(符號點的左邊)和零列表或多個可選參數(一個符號點的右側):

(lambda (mandadory1 mandatory2 . optional) (display mandatory1)) 
+3

'(.args)'無效方案讀取語法。然而,Guile似乎擴展了它的讀者閱讀它作爲'args'。這絕對不是可移植的,正如你所說,最好避免。 – 2012-01-11 14:25:41

+1

非常好,謝謝。我認爲這是另一回事;假設只有點形式是完全標準的,而「裸」形式有點奇怪。我猜想,對於我的初學者來說,點形式會更自然地遵循其他形式。 – Janne 2012-01-11 14:50:55

1

這讓我失望接力;直到這一點我已經假定形式參數總是封閉在一個列表:

注意之類的東西(a . args)(a b . args)是不是真的列出兩種。 (a . args)是一對,其中car是符號acdr是符號args(a b . args)是一對,其中car是符號a而且cdr是(一對,其中car是符號bcdr是符號args)。它看起來有點像一個列表,有ab和那個,但是因爲它不以null /空列表結束,所以它不是一個真正的列表。像這樣的結構通常被稱爲不正確的列表。如果你想,你可以閱讀一些關於點,對符號here,或別的地方...

隨着(. args)我想也許這樣說:「這是一對,其中cdr是符號args」。或者,也許它會出現,如「一對carcdrargs」。無論哪種方式,它都沒有多大意義,正如Chris Jester-Young所說,這不是真正有效的Scheme。

所以。諸如(a b . args)之類的東西只是常規的虛線對符號,用於在最後的cdr中放置不爲零的東西。如果Scheme中的形式參數可以是這些不正確的列表或適當的列表或符號中的一個,那麼形式參數的定義必須是這樣的:形式參數必須爲空,符號,或者一對,car是一個符號,cdr是一個正式的參數。 (我認爲這是一種很酷的事情,它使參數綁定參數的方式非常優雅,比如,你看看形式參數的東西,如果它是一個符號,你可以將參數列表綁定到如果它是一對,你將參數的car綁定到形式參數的cdr之上,並在形式參數cdr上重複出現的東西/參數(哦,如果它是空的,你就像做了什麼或什麼的)。令我比「如果在car符號爲&rest你的剩餘參數綁定後,符號」的Common Lisp的方式更漂亮一點。)

+0

虛線對 - 我從來沒有聯繫過。認爲這是正式參數規範的具體表示法。謝謝;當我有機會時,我會編輯我的問題。 – Janne 2012-01-28 00:17:48

相關問題