From eb1eb6771c5508074cf54175529e58a647516067 Mon Sep 17 00:00:00 2001 From: David Nolen Date: Tue, 21 Jul 2026 16:24:07 -0400 Subject: [PATCH 1/9] first just lift out the macro helper fns --- src/main/clojure/cljs/core.cljc | 184 ++++++++++++++++---------------- 1 file changed, 93 insertions(+), 91 deletions(-) diff --git a/src/main/clojure/cljs/core.cljc b/src/main/clojure/cljs/core.cljc index 18fef7f68..674019321 100644 --- a/src/main/clojure/cljs/core.cljc +++ b/src/main/clojure/cljs/core.cljc @@ -626,100 +626,102 @@ `(when-not (exists? ~qualified) (def ~x ~init)))) +(core/defn ^:private destvec* + [pb bvec b val] + (core/let [gvec (gensym "vec__") + gseq (gensym "seq__") + gfirst (gensym "first__") + has-rest (some #{'&} b)] + (core/loop [ret (core/let [ret (conj bvec gvec val)] + (if has-rest + (conj ret gseq (core/list `seq gvec)) + ret)) + n 0 + bs b + seen-rest? false] + (if (seq bs) + (core/let [firstb (first bs)] + (core/cond + (= firstb '&) (recur (pb ret (second bs) gseq) + n + (nnext bs) + true) + (= firstb :as) (pb ret (second bs) gvec) + :else (if seen-rest? + (throw #?(:clj (new Exception "Unsupported binding form, only :as can follow & parameter") + :cljs (new js/Error "Unsupported binding form, only :as can follow & parameter"))) + (recur (pb (if has-rest + (conj ret + gfirst `(first ~gseq) + gseq `(next ~gseq)) + ret) + firstb + (if has-rest + gfirst + (core/list `nth gvec n nil))) + (core/inc n) + (next bs) + seen-rest?)))) + ret)))) + +(core/defn ^:private destmap* + [pb bvec b v] + (core/let [gmap (gensym "map__") + defaults (:or b)] + (core/loop [ret (core/-> bvec (conj gmap) (conj v) + (conj gmap) (conj `(--destructure-map ~gmap)) + ((core/fn [ret] + (if (:as b) + (conj ret (:as b) gmap) + ret)))) + bes (core/let [transforms + (reduce + (core/fn [transforms mk] + (if (core/keyword? mk) + (core/let [mkns (namespace mk) + mkn (name mk)] + (core/cond (= mkn "keys") (assoc transforms mk #(keyword (core/or mkns (namespace %)) (name %))) + (= mkn "syms") (assoc transforms mk #(core/list `quote (symbol (core/or mkns (namespace %)) (name %)))) + (= mkn "strs") (assoc transforms mk core/str) + :else transforms)) + transforms)) + {} + (keys b))] + (reduce + (core/fn [bes entry] + (reduce #(assoc %1 %2 ((val entry) %2)) + (dissoc bes (key entry)) + ((key entry) bes))) + (dissoc b :as :or) + transforms))] + (if (seq bes) + (core/let [bb (key (first bes)) + bk (val (first bes)) + local (if #?(:clj (core/instance? clojure.lang.Named bb) + :cljs (cljs.core/implements? INamed bb)) + (with-meta (symbol nil (name bb)) (meta bb)) + bb) + bv (if (contains? defaults local) + (core/list 'cljs.core/get gmap bk (defaults local)) + (core/list 'cljs.core/get gmap bk))] + (recur + (if (core/or (core/keyword? bb) (core/symbol? bb)) ;(ident? bb) + (core/-> ret (conj local bv)) + (pb ret bb bv)) + (next bes))) + ret)))) + (core/defn destructure [bindings] (core/let [bents (partition 2 bindings) pb (core/fn pb [bvec b v] - (core/let [pvec - (core/fn [bvec b val] - (core/let [gvec (gensym "vec__") - gseq (gensym "seq__") - gfirst (gensym "first__") - has-rest (some #{'&} b)] - (core/loop [ret (core/let [ret (conj bvec gvec val)] - (if has-rest - (conj ret gseq (core/list `seq gvec)) - ret)) - n 0 - bs b - seen-rest? false] - (if (seq bs) - (core/let [firstb (first bs)] - (core/cond - (= firstb '&) (recur (pb ret (second bs) gseq) - n - (nnext bs) - true) - (= firstb :as) (pb ret (second bs) gvec) - :else (if seen-rest? - (throw #?(:clj (new Exception "Unsupported binding form, only :as can follow & parameter") - :cljs (new js/Error "Unsupported binding form, only :as can follow & parameter"))) - (recur (pb (if has-rest - (conj ret - gfirst `(first ~gseq) - gseq `(next ~gseq)) - ret) - firstb - (if has-rest - gfirst - (core/list `nth gvec n nil))) - (core/inc n) - (next bs) - seen-rest?)))) - ret)))) - pmap - (core/fn [bvec b v] - (core/let [gmap (gensym "map__") - defaults (:or b)] - (core/loop [ret (core/-> bvec (conj gmap) (conj v) - (conj gmap) (conj `(--destructure-map ~gmap)) - ((core/fn [ret] - (if (:as b) - (conj ret (:as b) gmap) - ret)))) - bes (core/let [transforms - (reduce - (core/fn [transforms mk] - (if (core/keyword? mk) - (core/let [mkns (namespace mk) - mkn (name mk)] - (core/cond (= mkn "keys") (assoc transforms mk #(keyword (core/or mkns (namespace %)) (name %))) - (= mkn "syms") (assoc transforms mk #(core/list `quote (symbol (core/or mkns (namespace %)) (name %)))) - (= mkn "strs") (assoc transforms mk core/str) - :else transforms)) - transforms)) - {} - (keys b))] - (reduce - (core/fn [bes entry] - (reduce #(assoc %1 %2 ((val entry) %2)) - (dissoc bes (key entry)) - ((key entry) bes))) - (dissoc b :as :or) - transforms))] - (if (seq bes) - (core/let [bb (key (first bes)) - bk (val (first bes)) - local (if #?(:clj (core/instance? clojure.lang.Named bb) - :cljs (cljs.core/implements? INamed bb)) - (with-meta (symbol nil (name bb)) (meta bb)) - bb) - bv (if (contains? defaults local) - (core/list 'cljs.core/get gmap bk (defaults local)) - (core/list 'cljs.core/get gmap bk))] - (recur - (if (core/or (core/keyword? bb) (core/symbol? bb)) ;(ident? bb) - (core/-> ret (conj local bv)) - (pb ret bb bv)) - (next bes))) - ret))))] - (core/cond - (core/symbol? b) (core/-> bvec (conj (if (namespace b) (symbol (name b)) b)) (conj v)) - (core/keyword? b) (core/-> bvec (conj (symbol (name b))) (conj v)) - (vector? b) (pvec bvec b v) - (map? b) (pmap bvec b v) - :else (throw - #?(:clj (new Exception (core/str "Unsupported binding form: " b)) - :cljs (new js/Error (core/str "Unsupported binding form: " b))))))) + (core/cond + (core/symbol? b) (core/-> bvec (conj (if (namespace b) (symbol (name b)) b)) (conj v)) + (core/keyword? b) (core/-> bvec (conj (symbol (name b))) (conj v)) + (vector? b) (destvec* pb bvec b v) + (map? b) (destmap* pb bvec b v) + :else (throw + #?(:clj (new Exception (core/str "Unsupported binding form: " b)) + :cljs (new js/Error (core/str "Unsupported binding form: " b)))))) process-entry (core/fn [bvec b] (pb bvec (first b) (second b)))] (if (every? core/symbol? (map first bents)) bindings From 63969895f2e6b52531e08f9452c026750a341ffd Mon Sep 17 00:00:00 2001 From: David Nolen Date: Mon, 3 Aug 2026 05:54:01 -0400 Subject: [PATCH 2/9] (wip) --- src/main/clojure/cljs/core.cljc | 50 ++++++++++++++++++++++++++++++++- 1 file changed, 49 insertions(+), 1 deletion(-) diff --git a/src/main/clojure/cljs/core.cljc b/src/main/clojure/cljs/core.cljc index 674019321..9a993d34f 100644 --- a/src/main/clojure/cljs/core.cljc +++ b/src/main/clojure/cljs/core.cljc @@ -667,7 +667,55 @@ (core/defn ^:private destmap* [pb bvec b v] (core/let [gmap (gensym "map__") - defaults (:or b)] + gignore (gensym "ignore__") + defaults (:or b) + defaults-as (:defaults b) + _ (core/when (core/and defaults-as (not defaults)) + (throw (new js/Error "Can't specify :defaults without :or"))) + b (dissoc b :defaults) + gdefaults (core/when defaults (zipmap (keys defaults) (repeatedly #(gensym "default__")))) + select (:select b) + all (:all b) + xf (core/fn [mk] + (core/let [mkns (namespace mk) + mkn (name mk)] + (core/cond + (.startsWith mkn "keys") #(keyword (core/or mkns (namespace %)) (name %)) + (.startsWith mkn "syms") #(core/list `quote (symbol (core/or mkns (namespace %)) (name %))) + (.startsWith mkn "strs") core/str + :else (throw (new js/Error (core/str "Unsupported map directive: " mk)))))) + ret (reduce (core/fn [ret e] + (conj ret (val e) (defaults (key e)))) + bvec defaults) + ret (core/-> ret (conj gmap) (conj v) + (conj gmap) + (conj `(--destructure-map ~gmap)) + ((core/fn [ret] + (if (:as b) + (conj ret (:as b) gmap) + ret)))) + bes (dissoc b :as :or :select :all) + localize (core/fn [bb] + (if #?(:clj (core/instance? clojure.lang.Named bb) + :cljs (cljs.core/implements? INamed bb)) + (with-meta (symbol nil (name bb)) (meta bb)) bb)) + push1 (core/fn [ret bb bk req?] + (core/let [getter (if req? `req! `get) + local (localize bb) + local-default? (contains? defaults local) + key-default? (contains? defaults bk) + bv (if (core/or local-default? key-default?) + (if (core/and local-default? key-default?) + (throw (new js/Error + (core/str "Multiple :or defaults for same key: " bk " '" "'"))) + (if req? + (throw (new js/Error + (core/str "Can't supply default value for required key: " bk))) + (core/list `get gmap bk (if local-default? (gdefaults local) (gdefaults bk))))) + (core/list getter gmap gmap bk))] + (if (ident? bb) + (core/-> ret (conj local bv)) + (pb ret bb bv))))] (core/loop [ret (core/-> bvec (conj gmap) (conj v) (conj gmap) (conj `(--destructure-map ~gmap)) ((core/fn [ret] From 856ff07c08ef3a7f8be7f40fb4194965af926ebf Mon Sep 17 00:00:00 2001 From: davidnolen Date: Sat, 8 Aug 2026 16:03:21 -0400 Subject: [PATCH 3/9] porting the rest, untested --- src/main/clojure/cljs/core.cljc | 139 ++++++++++++++++++++------------ 1 file changed, 89 insertions(+), 50 deletions(-) diff --git a/src/main/clojure/cljs/core.cljc b/src/main/clojure/cljs/core.cljc index 9a993d34f..65d1f2fb0 100644 --- a/src/main/clojure/cljs/core.cljc +++ b/src/main/clojure/cljs/core.cljc @@ -648,7 +648,7 @@ true) (= firstb :as) (pb ret (second bs) gvec) :else (if seen-rest? - (throw #?(:clj (new Exception "Unsupported binding form, only :as can follow & parameter") + (throw #?(:clj (new Exception "Unsupported binding form, only :as can follow & parameter") :cljs (new js/Error "Unsupported binding form, only :as can follow & parameter"))) (recur (pb (if has-rest (conj ret @@ -671,7 +671,8 @@ defaults (:or b) defaults-as (:defaults b) _ (core/when (core/and defaults-as (not defaults)) - (throw (new js/Error "Can't specify :defaults without :or"))) + #?(:clj (throw (new IllegalArgumentException "Can't specify :defaults without :or")) + :cljs (throw (new js/Error "Can't specify :defaults without :or")))) b (dissoc b :defaults) gdefaults (core/when defaults (zipmap (keys defaults) (repeatedly #(gensym "default__")))) select (:select b) @@ -683,7 +684,8 @@ (.startsWith mkn "keys") #(keyword (core/or mkns (namespace %)) (name %)) (.startsWith mkn "syms") #(core/list `quote (symbol (core/or mkns (namespace %)) (name %))) (.startsWith mkn "strs") core/str - :else (throw (new js/Error (core/str "Unsupported map directive: " mk)))))) + :else (throw #?(:clj (new Exception (core/str "Unsupported map directive: " mk)) + :cljs (new js/Error (core/str "Unsupported map directive: " mk))))))) ret (reduce (core/fn [ret e] (conj ret (val e) (defaults (key e)))) bvec defaults) @@ -706,58 +708,95 @@ key-default? (contains? defaults bk) bv (if (core/or local-default? key-default?) (if (core/and local-default? key-default?) - (throw (new js/Error - (core/str "Multiple :or defaults for same key: " bk " '" "'"))) + #?(:clj (throw (new Exception + (core/str "Multiple :or defaults for same key: " bk " '" "'"))) + :cljs (throw (new js/Error + (core/str "Multiple :or defaults for same key: " bk " '" "'")))) (if req? - (throw (new js/Error - (core/str "Can't supply default value for required key: " bk))) + #?(:clj (throw (new Exception + (core/str "Can't supply default value for required key: " bk))) + :cljs (throw (new js/Error + (core/str "Can't supply default value for required key: " bk)))) (core/list `get gmap bk (if local-default? (gdefaults local) (gdefaults bk))))) (core/list getter gmap gmap bk))] (if (ident? bb) (core/-> ret (conj local bv)) - (pb ret bb bv))))] - (core/loop [ret (core/-> bvec (conj gmap) (conj v) - (conj gmap) (conj `(--destructure-map ~gmap)) - ((core/fn [ret] - (if (:as b) - (conj ret (:as b) gmap) - ret)))) - bes (core/let [transforms - (reduce - (core/fn [transforms mk] - (if (core/keyword? mk) - (core/let [mkns (namespace mk) - mkn (name mk)] - (core/cond (= mkn "keys") (assoc transforms mk #(keyword (core/or mkns (namespace %)) (name %))) - (= mkn "syms") (assoc transforms mk #(core/list `quote (symbol (core/or mkns (namespace %)) (name %)))) - (= mkn "strs") (assoc transforms mk core/str) - :else transforms)) - transforms)) - {} - (keys b))] - (reduce - (core/fn [bes entry] - (reduce #(assoc %1 %2 ((val entry) %2)) - (dissoc bes (key entry)) - ((key entry) bes))) - (dissoc b :as :or) - transforms))] - (if (seq bes) - (core/let [bb (key (first bes)) - bk (val (first bes)) - local (if #?(:clj (core/instance? clojure.lang.Named bb) - :cljs (cljs.core/implements? INamed bb)) - (with-meta (symbol nil (name bb)) (meta bb)) - bb) - bv (if (contains? defaults local) - (core/list 'cljs.core/get gmap bk (defaults local)) - (core/list 'cljs.core/get gmap bk))] - (recur - (if (core/or (core/keyword? bb) (core/symbol? bb)) ;(ident? bb) - (core/-> ret (conj local bv)) - (pb ret bb bv)) - (next bes))) - ret)))) + (pb ret bb bv)))) + retsel + (core/loop [ret ret, sel #{}, bes bes, b->k {}, subs nil, suba nil] + (if (seq bes) + (core/let [be (first bes), bb (key be), bk (val be)] + (if (core/keyword? bb) + (core/let [dir bb + tr (xf bb) + req? (.endsWith (name bb) "!") + retsel + (core/loop [ret ret, sel sel, bbs (seq bk), preamp? true, b->k b->k] + (if (seq bbs) + (core/let [bb (first bbs)] + (if (= bb '&) + (if preamp? + (recur ret sel (next bbs) false b->k) + #?(:clj (throw (new IllegalArgumentException (core/str "& can only appear once in " dir))) + :cljs (throw (new js/Error (core/str "& can only appear once in " dir))))) + (core/let [_ + (core/when (core/and (not preamp?) (core/symbol? bb)) + #?(:clj (throw + (new IllegalArgumentException + (core/str "'" bb + "' - binding symbols can only appear before '&', use keys after"))) + :cljs (throw + (new js/Error + (core/str "'" bb + "' - binding symbols can only appear before '&', use keys after"))))) + bk (if preamp? (tr bb) bb)] + (recur (if (core/or preamp? req?) + (push1 ret (if preamp? bb gignore) bk req?) + ret) + (conj sel bk) + (next bbs) preamp? + (if preamp? (assoc b->k (localize bb) bk) b->k))))) + {:ret ret, :sel sel, :b->k b->k}))] + (recur (:ret retsel) (:sel retsel) (next bes) (:b->k retsel) subs suba)) + (core/let [subsel? (core/and select (map? bb)) + bb (if (core/or (core/not subsel?) (:select bb)) + bb + (assoc bb :select (gensym "select__"))) + subs (if subsel? (assoc subs bk (:select bb)) subs) + suball? (core/and all (map? bb)) + bb (if (core/or (core/not suball?) (:all bb)) + bb + (assoc bb :all (gensym "all__"))) + suba (if suball? (assoc suba bk (:all bb)) suba) + b->k (if (core/symbol? bb) (assoc b->k bb bk) b->k)] + (recur (push1 ret bb bk false) (conj sel bk) (next bes) b->k subs suba)))) + {:ret ret, :sel sel, :b->k b->k :subs subs})) + ret (:ret retsel), sel (:sel retsel), b->k (:b->k retsel) + new-or-code (core/and defaults (core/or defaults-as select all)) + bk #(if (core/symbol? %) + (core/let [bk (b->k %)] + (core/when (core/and new-or-code (core/not bk)) + #?(:clj (throw (new IllegalArgumentException (core/str "symbol " % " in :or does not refer to a binding"))) + :cljs (throw (new js/Error (core/str "symbol " % " in :or does not refer to a binding"))))) + bk) + %) + dm (core/when defaults (dissoc (zipmap (map bk (keys gdefaults)) (vals gdefaults)) nil)) + _ (core/and new-or-code (core/not= (count (select-keys dm sel)) (count defaults)) + #?(:clj (throw (new IllegalArgumentException (core/str "keys " + (apply disj (set (keys dm)) sel) + " appear only in :or"))) + :cljs (throw (new js/Error (core/str "keys " + (apply disj (set (keys dm)) sel) + " appear only in :or"))))) + ret (if select + (conj ret select `(when-let [mm# (merge (some-vals (select-keys ~dm ~sel)) ~gmap (some-vals ~(:subs retsel)))] + (select-keys mm# ~sel))) + ret) + ret (if all + (conj ret all `(merge (some-vals ~dm) ~gmap (some-vals ~(:suba retsel)))) + ret) + ret (if defaults-as (conj ret defaults-as dm) ret)] + ret)) (core/defn destructure [bindings] (core/let [bents (partition 2 bindings) From bd9b1a6dc801acc11e2a2ae283b91100e8f8d365 Mon Sep 17 00:00:00 2001 From: davidnolen Date: Sat, 8 Aug 2026 16:17:32 -0400 Subject: [PATCH 4/9] fix two obvious typos --- src/main/clojure/cljs/core.cljc | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/main/clojure/cljs/core.cljc b/src/main/clojure/cljs/core.cljc index 65d1f2fb0..5d78c5f60 100644 --- a/src/main/clojure/cljs/core.cljc +++ b/src/main/clojure/cljs/core.cljc @@ -718,7 +718,7 @@ :cljs (throw (new js/Error (core/str "Can't supply default value for required key: " bk)))) (core/list `get gmap bk (if local-default? (gdefaults local) (gdefaults bk))))) - (core/list getter gmap gmap bk))] + (core/list getter gmap bk))] (if (ident? bb) (core/-> ret (conj local bv)) (pb ret bb bv)))) @@ -770,7 +770,7 @@ suba (if suball? (assoc suba bk (:all bb)) suba) b->k (if (core/symbol? bb) (assoc b->k bb bk) b->k)] (recur (push1 ret bb bk false) (conj sel bk) (next bes) b->k subs suba)))) - {:ret ret, :sel sel, :b->k b->k :subs subs})) + {:ret ret, :sel sel, :b->k b->k :subs subs :suba suba})) ret (:ret retsel), sel (:sel retsel), b->k (:b->k retsel) new-or-code (core/and defaults (core/or defaults-as select all)) bk #(if (core/symbol? %) From 44508f000c15c14d08f201334127ccbe6be7c58a Mon Sep 17 00:00:00 2001 From: davidnolen Date: Sat, 8 Aug 2026 16:50:21 -0400 Subject: [PATCH 5/9] some other missed things --- src/main/clojure/cljs/core.cljc | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/src/main/clojure/cljs/core.cljc b/src/main/clojure/cljs/core.cljc index 5d78c5f60..50f1780d8 100644 --- a/src/main/clojure/cljs/core.cljc +++ b/src/main/clojure/cljs/core.cljc @@ -670,7 +670,7 @@ gignore (gensym "ignore__") defaults (:or b) defaults-as (:defaults b) - _ (core/when (core/and defaults-as (not defaults)) + _ (core/when (core/and defaults-as (core/not defaults)) #?(:clj (throw (new IllegalArgumentException "Can't specify :defaults without :or")) :cljs (throw (new js/Error "Can't specify :defaults without :or")))) b (dissoc b :defaults) @@ -682,7 +682,7 @@ mkn (name mk)] (core/cond (.startsWith mkn "keys") #(keyword (core/or mkns (namespace %)) (name %)) - (.startsWith mkn "syms") #(core/list `quote (symbol (core/or mkns (namespace %)) (name %))) + (.startsWith mkn "syms") #(core/list `quote (core/symbol (core/or mkns (namespace %)) (name %))) (.startsWith mkn "strs") core/str :else (throw #?(:clj (new Exception (core/str "Unsupported map directive: " mk)) :cljs (new js/Error (core/str "Unsupported map directive: " mk))))))) @@ -700,7 +700,7 @@ localize (core/fn [bb] (if #?(:clj (core/instance? clojure.lang.Named bb) :cljs (cljs.core/implements? INamed bb)) - (with-meta (symbol nil (name bb)) (meta bb)) bb)) + (with-meta (core/symbol nil (name bb)) (meta bb)) bb)) push1 (core/fn [ret bb bk req?] (core/let [getter (if req? `req! `get) local (localize bb) From 5b6ad33a64bc446b59cc7beb0f94ab283ad7c60b Mon Sep 17 00:00:00 2001 From: davidnolen Date: Sat, 8 Aug 2026 17:20:53 -0400 Subject: [PATCH 6/9] missing changes --- src/main/clojure/cljs/core.cljc | 19 +++++++------------ 1 file changed, 7 insertions(+), 12 deletions(-) diff --git a/src/main/clojure/cljs/core.cljc b/src/main/clojure/cljs/core.cljc index 50f1780d8..2b766b8e6 100644 --- a/src/main/clojure/cljs/core.cljc +++ b/src/main/clojure/cljs/core.cljc @@ -709,9 +709,9 @@ bv (if (core/or local-default? key-default?) (if (core/and local-default? key-default?) #?(:clj (throw (new Exception - (core/str "Multiple :or defaults for same key: " bk " '" "'"))) + (core/str "Multiple :or defaults for same key: " bk " '" local "'"))) :cljs (throw (new js/Error - (core/str "Multiple :or defaults for same key: " bk " '" "'")))) + (core/str "Multiple :or defaults for same key: " bk " '" local "'")))) (if req? #?(:clj (throw (new Exception (core/str "Can't supply default value for required key: " bk))) @@ -802,21 +802,16 @@ (core/let [bents (partition 2 bindings) pb (core/fn pb [bvec b v] (core/cond - (core/symbol? b) (core/-> bvec (conj (if (namespace b) (symbol (name b)) b)) (conj v)) - (core/keyword? b) (core/-> bvec (conj (symbol (name b))) (conj v)) - (vector? b) (destvec* pb bvec b v) - (map? b) (destmap* pb bvec b v) + (core/symbol? b) (core/-> bvec (conj b) (conj v)) + (core/vector? b) (destvec* pb bvec b v) + (core/map? b) (destmap* pb bvec b v) :else (throw - #?(:clj (new Exception (core/str "Unsupported binding form: " b)) + #?(:clj (new Exception (core/str "Unsupported binding form: " b)) :cljs (new js/Error (core/str "Unsupported binding form: " b)))))) process-entry (core/fn [bvec b] (pb bvec (first b) (second b)))] (if (every? core/symbol? (map first bents)) bindings - (core/if-let [kwbs (seq (filter #(core/keyword? (first %)) bents))] - (throw - #?(:clj (new Exception (core/str "Unsupported binding key: " (ffirst kwbs))) - :cljs (new js/Error (core/str "Unsupported binding key: " (ffirst kwbs))))) - (reduce process-entry [] bents))))) + (reduce process-entry [] bents)))) (core/defmacro ^:private return-first [& body] From f2fd21977c96692404ec486a7c8c8234121eaf3f Mon Sep 17 00:00:00 2001 From: davidnolen Date: Sat, 8 Aug 2026 17:50:27 -0400 Subject: [PATCH 7/9] fix typo --- src/main/clojure/cljs/core.cljc | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/main/clojure/cljs/core.cljc b/src/main/clojure/cljs/core.cljc index 2b766b8e6..86b276064 100644 --- a/src/main/clojure/cljs/core.cljc +++ b/src/main/clojure/cljs/core.cljc @@ -789,7 +789,7 @@ (apply disj (set (keys dm)) sel) " appear only in :or"))))) ret (if select - (conj ret select `(when-let [mm# (merge (some-vals (select-keys ~dm ~sel)) ~gmap (some-vals ~(:subs retsel)))] + (conj ret select `(when-let [mm# (merge (some-vals ~dm) ~gmap (some-vals ~(:subs retsel)))] (select-keys mm# ~sel))) ret) ret (if all From 3f81d6fd6d0a38c6a0e01002a28130dc12632f1b Mon Sep 17 00:00:00 2001 From: davidnolen Date: Sat, 8 Aug 2026 17:54:07 -0400 Subject: [PATCH 8/9] another typo --- src/main/clojure/cljs/core.cljc | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/main/clojure/cljs/core.cljc b/src/main/clojure/cljs/core.cljc index 86b276064..0f7ca4f0e 100644 --- a/src/main/clojure/cljs/core.cljc +++ b/src/main/clojure/cljs/core.cljc @@ -688,7 +688,7 @@ :cljs (new js/Error (core/str "Unsupported map directive: " mk))))))) ret (reduce (core/fn [ret e] (conj ret (val e) (defaults (key e)))) - bvec defaults) + bvec gdefaults) ret (core/-> ret (conj gmap) (conj v) (conj gmap) (conj `(--destructure-map ~gmap)) From a4f94bcd4402424aaafbce27e3bac32ab3b6378d Mon Sep 17 00:00:00 2001 From: davidnolen Date: Sat, 8 Aug 2026 18:34:01 -0400 Subject: [PATCH 9/9] fully qualify `get and `req! for bootstrapped --- src/main/clojure/cljs/core.cljc | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/main/clojure/cljs/core.cljc b/src/main/clojure/cljs/core.cljc index 0f7ca4f0e..c735659bf 100644 --- a/src/main/clojure/cljs/core.cljc +++ b/src/main/clojure/cljs/core.cljc @@ -702,7 +702,7 @@ :cljs (cljs.core/implements? INamed bb)) (with-meta (core/symbol nil (name bb)) (meta bb)) bb)) push1 (core/fn [ret bb bk req?] - (core/let [getter (if req? `req! `get) + (core/let [getter (if req? `cljs.core/req! `cljs.core/get) local (localize bb) local-default? (contains? defaults local) key-default? (contains? defaults bk) @@ -717,7 +717,7 @@ (core/str "Can't supply default value for required key: " bk))) :cljs (throw (new js/Error (core/str "Can't supply default value for required key: " bk)))) - (core/list `get gmap bk (if local-default? (gdefaults local) (gdefaults bk))))) + (core/list `cljs.core/get gmap bk (if local-default? (gdefaults local) (gdefaults bk))))) (core/list getter gmap bk))] (if (ident? bb) (core/-> ret (conj local bv))