seq? sequential? coll?
コレクションっぽいデータ構造にたいして、それぞれどうなるか調べてみた。
結果
seq? | sequential? | coll? | |
---|---|---|---|
Java配列 (int-array 2) |
false | false | false |
文字列 "12" |
false | false | false |
セット #{1 2} |
false | false | true |
マップ {:a 1 :b 2} |
false | false | true |
ベクタ [1 2] |
false | true | true |
リスト '(1 2) |
true | true | true |
遅延シーケンス (lazy-seq [1 2]) |
true | true | true |
- java配列と文字列は、どれにも該当しない。
- リストと遅延リストは、全てに該当する。
- マップとセットは、coll?に該当するが、seq? や sequential? には該当しない。
- ベクタは、coll?とsequential?に該当するが、seq? には該当しない。
マルチメソッド書くときに注意が必要ですね。
ちなみにソースコードは
それぞれこんなでした。
;; clojure 1.1.0 (def seq? (fn seq? [x] (instance? clojure.lang.ISeq x))) (defn sequential? [coll] (instance? clojure.lang.Sequential coll)) (defn coll? [x] (instance? clojure.lang.IPersistentCollection x))