2012-07-15 11 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

答えて

6

「『ほかの場所』異なるで起こるかもしれません 『』 コンクリート種類に応じて。」

これは、パフォーマンスと基本的な実装に関して最も効率的な方法で追加を組み込んだClojureの永続的なコレクションの動作を指します。

ベクターは、常にコレクションの末尾に追加します:あなたが気づいたようリストを

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

を、CONJは、リストの先頭にある項目を置く:

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

Clojureのの中IPersistentCollectionインターフェイス上consの実装にそのconj単にデリゲートを実現することが重要ですJavaのもの。したがって、処理されるデータ構造によっては、動作が異なる場合があります。

conjの目的は、最も効率的な方法でアイテムを常にデータ構造に追加することです。

リストの場合、それを置く最も効率的な場所は前面です。ベクトルの場合、それを置く最も効率的な場所は最後です。

関連する問題