Skip to content

Commit 5d78fd5

Browse files
committed
Generalize vector and map emitters.
1 parent 1134811 commit 5d78fd5

File tree

1 file changed

+22
-17
lines changed

1 file changed

+22
-17
lines changed

src/clj/cljc/compiler.clj

Lines changed: 22 additions & 17 deletions
Original file line numberDiff line numberDiff line change
@@ -326,15 +326,23 @@
326326
(defmethod emit-constant clojure.lang.Cons [x]
327327
(FIXME-IMPLEMENT))
328328

329+
(defn- emit-seq-construction [items empty prefix emitter postfix]
330+
(letfn [(emit-rec [xs]
331+
(if xs
332+
(do
333+
(emits prefix)
334+
(emit-rec (next xs))
335+
(emitter (first xs))
336+
(emits postfix))
337+
(emits empty)))]
338+
(emit-rec (seq (reverse items)))))
339+
329340
(defn- persistent-vector-emit-seq [items]
330-
(letfn [(emit-conj [xs]
331-
(if (empty? xs)
332-
(emits "VAR_NAME (cljc_DOT_core_DOT_PersistentVector_SLASH_EMPTY)")
333-
(do
334-
(emits "FUNCALL2 ((closure_t*)VAR_NAME (cljc_DOT_core_SLASH__conj), ")
335-
(emit-conj (rest xs))
336-
(emits ", " (first xs) ")"))))]
337-
(emit-conj (reverse items))))
341+
(emit-seq-construction items
342+
"VAR_NAME (cljc_DOT_core_DOT_PersistentVector_SLASH_EMPTY)"
343+
"FUNCALL2 ((closure_t*)VAR_NAME (cljc_DOT_core_SLASH__conj), "
344+
#(emits ", " %)
345+
")"))
338346

339347
(defmethod emit-constant clojure.lang.IPersistentVector [x]
340348
(let [names (doall (map emit-constant x))]
@@ -343,15 +351,12 @@
343351
(persistent-vector-emit-seq names)))))
344352

345353
(defn- persistent-hash-map-emit-kv-pairs [keys vals]
346-
(letfn [(emit-assoc [keys vals]
347-
(if (empty? keys)
348-
(emits "VAR_NAME (cljc_DOT_core_DOT_PersistentHashMap_SLASH_EMPTY)")
349-
(do
350-
(emits "FUNCALL3 ((closure_t*)VAR_NAME (cljc_DOT_core_SLASH__assoc), ")
351-
(emit-assoc (next keys)(next vals))
352-
(emits ", " (first keys))
353-
(emits ", " (first vals) ")"))))]
354-
(emit-assoc (reverse keys) (reverse vals))))
354+
(emit-seq-construction (map vector keys vals)
355+
"VAR_NAME (cljc_DOT_core_DOT_PersistentHashMap_SLASH_EMPTY)"
356+
"FUNCALL3 ((closure_t*)VAR_NAME (cljc_DOT_core_SLASH__assoc), "
357+
(fn [[k v]]
358+
(emits ", " k ", " v))
359+
")"))
355360

356361
(defmethod emit-constant clojure.lang.IPersistentMap [x]
357362
(FIXME-IMPLEMENT))

0 commit comments

Comments
 (0)