2011-10-04 64 views
8

利弊目前的行爲就像這樣:在Clojure中,如何對一個集合的元素而不是集合本身進行利弊呢?

(cons '(1 2) '(3)) 
;=> ((1 2) 3) 

我想實現:

(magic-cons '(1 2) '(3)) 
;=> (1 2 3) 

我找不到這個資源然而,這似乎很簡單,我覺得應該有一個內置的功能。

或者我只是不知道寫詞來描述這種情況。無論哪種方式,請讓我知道。謝謝!

編輯: 請不要以 「扁平化」 回答:P即

(flatten (cons '(1 2) '(3))) 
+3

只是爲了更好地理解'缺點'。 'cons'代表「構造」。它構建了列表,將新元素逐一添加到列表的開頭。你正在尋找的函數的類型應該將一個列表的所有元素附加到另一個列表,或者只是連接兩個列表。因此,在Common Lisp中,它被稱爲「追加」,在Clojure中,正如其他人在這裏已經提到的那樣,「concat」。 – ffriend

回答

10

你必須使用concat

clojure.core/concat 
([] [x] [x y] [x y & zs]) 
    Returns a lazy seq representing the concatenation of the elements in the supplied colls. 

使用示例:

user> (concat '(1 2) '(3)) 
(1 2 3) 
5

我相信你正在尋找concat(認爲 「串聯列表」):

[的毗連]返回一個lazy seq,表示所提供的colls中元素的連接。

在這種情況下,用法是:

(concat '(1 2) '(3))  

注意,與(多)其他LISP方言,Clojure的concat產生一個懶惰序列。請參閱How to covert a lazy sequence to a non-lazy in Clojure?以瞭解如何「強制」一個序列(這可能會或可能不會有用/需要,這取決於較大的上下文,但重要的是要記住)。

快樂編碼。

4

另一種方法是 「進」。

成總是返回第一個參數的類型,不像concat總是返回一個列表。

=> (into [2 4] '(1 2 3)) 
[2 4 1 2 3] 

(into '(2 4) '(1 2 3)) 
(3 2 1 2 4) 
相關問題