TL;DR
- Clojure のベクタは
[ ]かvectorで定義し、どんな型の値でも格納できる。 first、rest、nthで要素を取得し、conjで末尾に、consで先頭に要素を追加する。元のベクタは変わらない。
内容
定義
Clojure では次のように定義する。
[1, 2, 3, 4]vector を使って、次のようにも書ける。
(vector 1 2 3) ;; [1, 2, 3]ベクタにはどんな型の値でも格納できる。
[1 true "Radish"]要素の取得
first を使うと、ベクタの先頭の要素を取得できる。
(def friends
["Ram", "Bashir", "Antony", "Buddha"]) ;; #'user/friends
(first friends) ;; "Ram"rest を使うと、先頭の要素以外の要素を取得できる。
(rest friends) // ("Bashir" "Antony" "Buddha")型を確かめると、friends と (rest friends) はどちらも PersistentVector であることが分かる。
(type friends) ;; clojure.lang.PersistentVector
(type (rest friends)) ;; clojure.lang.PersistentVector$ChunkedSeqnth を使うと、任意の要素を取得できる。
(nth friends 3) ;; "Buddha"範囲外の値を指定すると、例外が発生する。
(nth friends 42)
;; Execution error (IndexOutOfBoundsException)ベクタを関数として扱い、インデックス番号を渡して要素を取得することもできる。
(friends 3) ;; "Buddha"要素の追加
conj を使うと、末尾に要素を追加できる。
(conj friends "Periyaar")
;; ["Ram" "Bashir" "Antony" "Buddha" "Periyaar"]ただし、元のベクタは影響を受けない(イミュータブル)。
friends ;; ["Ram" "Bashir" "Antony" "Buddha"]cons を使うと、先頭に要素を追加できる。
(cons "Periyaar" friends)
;; ("Periyaar" "Ram" "Bashir" "Antony" "Buddha")