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))