2012-07-15 41 views
5
(conj (drop-last "abcde") (last "abcde")) 

回報(\e \a \b \c \d)有人可以解釋「conj」的行爲嗎?

我困惑。在conj的文檔中,我注意到

'添加'可能發生在不同'地點',具體取決於具體類型。

這是否意味着對於LazySeq,添加新項目的地方是頭部? 如何才能得到(\a \b \c \d \e)

+0

可能的重複:http://stackoverflow.com/questions/7437833/inconsistency-with-clojures-sequences/7438355 – Gert 2012-07-15 21:50:06

回答

6

「的‘另外的地方’可能在不同的發生‘’取決於 具體類型。」

這指的是Clojure持久集合的行爲,它將性能和底層實現方面的最有效方法相加。

矢量總是添加到集合的末尾:

user=> (conj [1 2 3] 4) 
[1 2 3 4] 

使用列表,連接詞使該項目在列表的前面,因爲你已經注意到:

user=> (conj '(1 2 3) 4) 
(4 1 2 3) 

所以,是的,LazySeq就其具體實現而言被視爲一個List。

我怎樣才能得到(\a \b \c \d \e)

有多種方式,但你可以很容易地創建您的LazySeq載體:

(conj (vec (drop-last "abcde")) 
     (last "abcde")) 
1

重要的是要認識到,conj只是代表們的cons在Clojure的在IPersistentCollection接口的實現Java的東西。因此,根據處理的給定數據結構,它可能會有不同的表現。

conj的意圖是它總是以最有效的方式將數據添加到數據結構中。

對於列出最有效的位置是前面。對於載體來說,最有效的地方就是最終。

相關問題