TL;DR
- Clojure のベクタは、
clojure.lang.IPersistentVectorインタフェースを実装したインスタンスである。 vecとvectorでベクタを作り、vector?で判定する。vector-ofを使うと、値をボクシングしない基本型のベクタを作れる。
内容
vec は、任意のコレクションをベクタに変換する。Java の配列を渡すと、変更できないようにコピーしたベクタを返す。vector は、引数の値を要素とする新しいベクタを返し、引数がなければ空のベクタを返す。
(vec [1 2 3]) ; [1 2 3]
(vec '(1 2 3)) ; [1 2 3]
(vec #{1 2 3}) ; [1 3 2]
(vec (range 3)) ; [0 1 2]
(vector 1 2 3) ; [1 2 3]
(vector) ; []vector? は、引数が IPersistentVector を実装しているかを判定する。
(map vector? ['() [] #{} {}]) ; (false true false false)
(map vector? [1 :keyword nil "string"]) ; (false false false false)vector-of は、第 1 引数で指定した基本型のベクタを返す。指定できるのは :int、:long、:float、:double、:byte、:short、:char、:boolean である。続けて要素を渡すと、その値で初期化できる。できたベクタは通常のベクタと同じインタフェースを持つが、内部で値をボクシングしない。そのため、メモリ使用量の削減とパフォーマンスの向上が期待できる。
(vector? (vector-of :int)) ; true
(vector-of :int 1 2 3) ; [1 2 3]
(vector-of :double 1.0 2.0 3.0) ; [1.0 2.0 3.0]
(type [1]) ; clojure.lang.PersistentVector
(type (conj (vector-of :int 1))) ; clojure.core.Vec