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) ; IllegalArgumentExceptionlist? は、引数が IPersistentList を実装しているかを判定する。
(map list? ['() [] #{} {}]) ; (true false false false)
(map list? [1 :keyword nil "string"]) ; (false false false false)