The following is from Learn clojure in Y minutes.
list - a linked list data structure
vector - an array data structure
These are java classes too:
> (class '(1 2 3))
clojure.lang.PersistentList
> (class (list 1 2 3))
clojure.lang.PersistentList
> (class [1 2 3])
clojure.lang.PersistentVector
Lists and vectors are collections.
collection - a group of data
> (coll? '(1 2 3))
true
> (coll? [1 2 3])
true
Only lists are sequences.
sequence - abstract description of a list of data
> (seq? '(1 2 3))
true
> (seq? [1 2 3])
false
You only need to provide an entry to a sequence when it is accessed.
> (range 4)
(0 1 2 3)
> (take 4 (range))
(0 1 2 3)
Because of this, seqs can be lazy.
lazy seq - defines an infinite series
> (range)
OutOfMemoryError Java heap space java.util.Arrays.copyOf (Arrays.java:2882)
cons - add an item to the beginning of a list or vector
> (cons 4 '(1 2 3))
(4 1 2 3)
> (cons 4 [1 2 3])
(4 1 2 3)
conj - adds an item to a collection in the most efficient way
For lists, the item is inserted to the beginning.
> (conj 4 '(1 2 3))
ClassCastException java.lang.Long cannot be cast to clojure.lang.IPersistentCollection clojure.core/conj (core.clj:83)
Oops.
> (conj '(1 2 3) 4)
(4 1 2 3)
For vectors, the item is added to the end.
> (conj 4 [1 2 3])
ClassCastException java.lang.Long cannot be cast to clojure.lang.IPersistentCollection clojure.core/conj (core.clj:83)
> (conj [1 2 3] 4)
[1 2 3 4]
This operation is not commutative.
concat - adds lists or collections together
> (concat [1 2] '(3 4))
(1 2 3 4)
To interact with collections, you can use functions like filter or map.
> (filter even? '(1 2 3))
(2)
> (map inc [1 2 3])
(2 3 4)
> (map inc (range 5)
(1 2 3 4 5)
reduce - used to reduce collections
The following distributes the + over each thing in the vector:
> (reduce + [1 2 3 4]) ; (+ (+ (+ 1 2) 3) 4)
10
reduce can also take three arguments, with the first argument defining an initial value. The following turns the list
'(3 2 1)into a vector:
> (reduce conj [] '(3 2 1))
; (conj (conj (conj [] 3) 2) 1)
[3 2 1]