[1 2 3]
ベクターは、インデックス付きのシーケンシャルなデータ構造です。ベクターは、次のように[ ]
で表されます。
[1 2 3]
「インデックス付き」とは、ベクターの要素をインデックスで取得できることを意味します。Clojure(Javaと同様)では、インデックスは1ではなく0から始まります。インデックスの要素を取得するには、get
関数を使用します。
user=> (get ["abc" false 99] 0)
"abc"
user=> (get ["abc" false 99] 1)
false
無効なインデックスでgetを呼び出すと、nil
が返されます。
user=> (get ["abc" false 99] 14)
nil
要素は、conj
(conjoinの略)でベクターに追加されます。要素は常にベクターの最後に追加されます。
user=> (conj [1 2 3] 4 5 6)
[1 2 3 4 5 6]
Clojureコレクションは、文字列や数値などの単純な値の重要なプロパティを共有します。たとえば、イミュータビリティや値による等価比較です。
たとえば、ベクターを作成し、conj
で変更してみましょう。
user=> (def v [1 2 3])
#'user/v
user=> (conj v 4 5 6)
[1 2 3 4 5 6]
ここで、conj
は新しいベクターを返しましたが、元のベクターを調べると、変更されていないことがわかります。
user=> v
[1 2 3]
コレクションを「変更」する関数は、新しいインスタンスを返します。プログラムは、変更されたインスタンスを利用するために、それを記憶するか、渡す必要があります。
リストはシーケンシャルな連結リストであり、ベクターのように末尾ではなく、リストの先頭に新しい要素を追加します。
リストは最初の要素を関数として呼び出すことで評価されるため、評価を防ぐためにリストを引用符で囲む必要があります。
(def cards '(10 :ace :jack 9))
リストはインデックス化されていないため、first
とrest
を使用して走査する必要があります。
user=> (first cards)
10
user=> (rest cards)
'(:ace :jack 9)