TL;DR

  • Clojure のリストは '( … ) か list で定義する。Clojure のプログラムはすべてリストで構成されている。
  • ベクタと同じく count、first、rest、nth、cons、conj が使えるが、関数として呼び出すことはできず、要素はどちらの方法でも先頭に追加される。

内容

ベクタと似ているが、ベクタは [ ] で囲むのに対して、リストは ( ) で囲む。Clojure のプログラムはすべてリストで構成されている。

定義

リストを定義するには、'( … ) を使う。

'(1 2 3 4) ;; (1 2 3 4)

もし ' がないと、Clojure は 1 を関数、2 3 4 を引数と捉えるので、エラーになる。

(1 2 3 4)
;; Execution error (ClassCastException)

list を使って定義することもできる。

(list 1 2 3) ;; (1 2 3)

要素の取得

ベクタと同じく、count、first、rest、nth がそれぞれ使える。

(def friends-list
	'("Ram", "Bashir", "Antony", "Buddha"))
 
(count friends-list) ;; 4
(first friends-list) ;; "Ram"
(rest friends-list)  ;; ("Bashir" "Antony" "Buddha")
(nth friends-list 3) ;; "Buddha"

ただし、ベクタのようにリストを関数として扱い、インデックス番号を渡すことはできない。

(friends-list 3)

要素の追加

要素を追加する cons と conj も使える。リストは内部的には単純な連結リストなので、どちらも新しい要素が先頭に付く。

(cons "Pariyaar" friends-list)
;; ("Pariyaar" "Ram" "Bashir" "Antony" "Buddha")
(conj friends-list "Pariyaar")
;; ("Pariyaar" "Ram" "Bashir" "Antony" "Buddha")

どちらの操作もイミュータブルなので、元のリストは影響を受けない。

friends-list ;; ("Ram" "Bashir" "Antony" "Buddha")

キーワード