(cons x seq)
Returns a new seq where x is the first element and seq is the rest.
;; prepend 1 to a list
(cons 1 '(2 3 4 5 6))
;;=> (1 2 3 4 5 6)
;; notice that the first item is not expanded
(cons [1 2] [4 5 6])
;;=> ([1 2] 4 5 6)
;; may return results of different types but always a seq
(map (juxt identity type seq? list?)
[(cons 1 nil)
(cons 1 '())])
;; => ([(1) clojure.lang.PersistentList true true]
;; [(1) clojure.lang.Cons true false])
;; Cons new-element into nested structures "cons-in"
(def db {:users [{:name "Eduardo"}]})
(def new-element {:name "Eva"})
(assoc db :users (cons new-element (:users db)))
;; => {:users ({:name "Eva"} {:name "Eduardo"})}
(defn zeros []
(lazy-seq (cons 0 (zeros))))
;; "cons" does not realize second parameter,
;; opening the world for recursive functions that create lazy sequences
(first (zeroes))
0
(first (rest (zeroes)))
0
(first (rest (rest (zeroes))))
0
;; example stolen from youtuber :
;; https://youtu.be/iaph8m63HQw?list=PLAC43CFB134E85266