Skip to content

Commit a93859a

Browse files
thomasmulvaneymfikes
authored andcommitted
CLJS-3005: empty on Cons shouldn't keep metadata
Also applying cons to nil, eg: (cons 'x nil) now produces a List as per Clojure rather than a Cons. This is important when trying to handle metadata correctly as a List is a collection and thus preserves metadata when emptied or conj'ed.
1 parent b38ad7e commit a93859a

File tree

2 files changed

+10
-6
lines changed

2 files changed

+10
-6
lines changed

src/main/cljs/cljs/core.cljs

Lines changed: 5 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -3274,7 +3274,7 @@ reduces them without incurring seq initialization"
32743274
(-conj [coll o] (Cons. nil o coll nil))
32753275

32763276
IEmptyableCollection
3277-
(-empty [coll] (-with-meta (.-EMPTY List) meta))
3277+
(-empty [coll] (.-EMPTY List))
32783278

32793279
ISequential
32803280
IEquiv
@@ -3295,10 +3295,10 @@ reduces them without incurring seq initialization"
32953295
(defn cons
32963296
"Returns a new seq where x is the first element and coll is the rest."
32973297
[x coll]
3298-
(if (or (nil? coll)
3299-
(implements? ISeq coll))
3300-
(Cons. nil x coll nil)
3301-
(Cons. nil x (seq coll) nil)))
3298+
(cond
3299+
(nil? coll) (List. nil x nil 1 nil)
3300+
(implements? ISeq coll) (Cons. nil x coll nil)
3301+
:default (Cons. nil x (seq coll) nil)))
33023302

33033303
(defn hash-keyword [k]
33043304
(int (+ (hash-symbol k) 0x9e3779b9)))

src/test/cljs/cljs/metadata_test.cljc

Lines changed: 5 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -160,4 +160,8 @@
160160

161161
(testing "ChunkedCons"
162162
(let [chunked-cons (seq (map inc (vec (range 100))))]
163-
(seq-interface-tests chunked-cons))))
163+
(seq-interface-tests chunked-cons)))
164+
165+
(testing "Cons"
166+
(seq-interface-tests (cons 'a ()))
167+
(seq-interface-tests (cons 'b (cons 'a ())))))

0 commit comments

Comments
 (0)