(Disclaimer – I’m aware of the significance of Seqs in Clojure)
In common lisp the cons function can be used to combine two symbols into a list:
(def s 'x) (def l 'y) (cons s l)
In clojure – you can only cons onto a sequence – cons hasn’t been extended to work with two symbols. So you have to write:
(def s 'x) (def l 'y) (cons s '(l))
Is there a higher level pattern in Clojure that explains this difference between Common LISP and Clojure?
Practice As Follows
In Clojure, unlike traditional Lisps, lists are not the primary data structures. The data structures can implement the ISeq interface – which is another view of the data structure it’s given – allowing the same functions to access elements in each. (Lists already implement this.
seq? checks whether something implements ISeq.
(seq? '(1 2)), (seq? [1 2])) Clojure simply acts differently (with good reason), in that when
cons is used, a sequence (it’s actually of type
clojure.lang.Cons) constructed of
(seq b) is returned. (
a being arg 1 and
b arg 2) Obviously, symbols don’t and can’t implement ISeq.
Sequences screencast/talk by Rich Hickey However, note that
rest has changed, and it’s previous behaviour is now in
next, and that
lazy-cons has been replaced by