Clojure:
1:13 user=> (first (conj '(1 2 3) 4))
4
1:14 user=> (first (conj [1 2 3] 4))
1
; . . .
1:17 user=> (first (conj (seq [1 2 3]) 4))
4
I understand what is going on, but should this work differently?
Documentation for conj
(from clojure.org):
conj[oin]. Returns a new collection with the xs 'added'. (conj nil item) returns (item). The 'addition' may happen at different 'places' depending on the concrete type.
It's more efficient to "add" elements to the end of a vector, while it's more efficient to do so at the beginning of lists. conj
uses whatever is the most efficient for the data structure you give it.
In the examples you give, '(1 2 3)
and (seq [1 2 3])
both implement ISeq
(see documentation for seq?
), while [1 2 3]
doesn't.
Clojure's conj
ultimately calls the cons
method (not to be confused with the cons
function - this method is internal clojure code) on the underlying data structure; for vectors (PersistentVector
), cons
adds elements to the end, while for lists they're added to the front (the cons
method for PersistentList
s returns a new list with the new element as its head, and the existing list as its tail).
If you look at Clojure Data Structures
you'll see that conj works differently with lists and vectors.
conj puts the added item at the front of the list and at the end of a vector.
I also suggest looking at Clojure API conj
which has some nice examples. ClojureDocs overall has some very nice examples for most Clojure commands.
If you love us? You can donate to us via Paypal or buy me a coffee so we can maintain and grow! Thank you!
Donate Us With