TL;DR

  • Clojure のリストは、clojure.lang.IPersistentList を実装したインスタンスである。
  • list でリストを作り、list* で最後の引数を連結したシーケンスを作り、list? でリストかを判定する。

内容

list は、引数の要素から新しいリストを作る。引数がなければ空のリストになる。要素の型は問わず、リストを入れ子にすることもできる。

(list 1 2 3)                 ; (1 2 3)
(list)                       ; ()
(list "a" "b" "c")           ; ("a" "b" "c")
(list (list 1 2) (list 3 4)) ; ((1 2) (3 4))

list* は、最後の引数以外を並べ、その後ろに最後の引数の要素を連結したシーケンスを返す。連結されるのは最後の引数だけなので、途中にあるベクタはそのまま 1 つの要素になる。最後の引数が連結できない型だと、IllegalArgumentException になる。

(list* 1 2 3 [4 5])       ; (1 2 3 4 5)
(list* 1 2 3 [4 5] [6 7]) ; (1 2 3 [4 5] 6 7)
(list* 1 2 3 4 5)         ; IllegalArgumentException

list? は、引数が IPersistentList を実装しているかを判定する。

(map list? ['() [] #{} {}])           ; (true false false false)
(map list? [1 :keyword nil "string"]) ; (false false false false)

キーワード