8000 * src/clj/cljs/compiler.clj: add *loop-lets* dynamic var for tracking… · clojure/clojurescript@6feae43 · GitHub
[go: up one dir, main page]

Skip to content
65F8

Commit 6feae43

Browse files
committed
* src/clj/cljs/compiler.clj: add *loop-lets* dynamic var for tracking let bindings in loops
1 parent 986ef58 commit 6feae43

File tree

1 file changed

+11
-4
lines changed

1 file changed

+11
-4
lines changed

src/clj/cljs/compiler.clj

Lines changed: 11 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -391,10 +391,12 @@
391391
(println "})()"))))
392392

393393
(defmethod emit :fn
394-
[{:keys [name env methods max-fixed-arity variadic recur-frames]}]
394+
[{:keys [name env methods max-fixed-arity variadic recur-frames loop-lets]}]
395395
;;fn statements get erased, serve no purpose and can pollute scope if named
396396
(when-not (= :statement (:context env))
397-
(let [loop-locals (seq (mapcat :names (filter #(and % @(:flag %)) recur-frames)))]
397+
(let [loop-locals (seq (concat
398+
(mapcat :names (filter #(and % @(:flag %)) recur-frames))
399+
(mapcat :name loop-lets)))]
398400
(when loop-locals
399401
(when (= :return (:context env))
400402
(print "return "))
@@ -586,6 +588,7 @@
586588
(def specials '#{if def fn* do let* loop* throw try* recur new set! ns deftype* defrecord* . js* & quote})
587589

588590
(def ^:dynamic *recur-frames* nil)
591+
(def ^:dynamic *loop-lets* nil)
589592

590593
(defmacro disallowing-recur [& body]
591594
`(binding [*recur-frames* (cons nil *recur-frames*)] ~@body))
@@ -720,7 +723,8 @@
720723
max-fixed-arity (apply max (map :max-fixed-arity methods))
721724
variadic (boolean (some :variadic methods))]
722725
;;todo - validate unique arities, at most one variadic, variadic takes max required args
723-
{:env env :op :fn :name mname :methods methods :variadic variadic :recur-frames *recur-frames*
726+
{:env env :op :fn :name mname :methods methods :variadic variadic
727+
:recur-frames *recur-frames* :loop-lets *loop-lets*
724728
:jsdoc [(when variadic "@param {...*} var_args")]
725729
:max-fixed-arity max-fixed-arity}))
726730

@@ -748,7 +752,10 @@
748752
[bes env])))
749753
recur-frame (when is-loop {:names (vec (map :name bes)) :flag (atom nil)})
750754
{:keys [statements ret children]}
751-
(binding [*recur-frames* (if recur-frame (cons recur-frame *recur-frames*) *recur-frames*)]
755+
(binding [*recur-frames* (if recur-frame (cons recur-frame *recur-frames*) *recur-frames*)
756+
*loop-lets* (cond
757+
is-loop ()
758+
*loop-lets* (cons {:names (vec (map :name bes))} *loop-lets*))]
752759
(analyze-block (assoc env :context (if (= :expr context) :return context)) exprs))]
753760
{:env encl-env :op :let :loop is-loop
754761
:bindings bes :statements statements :ret ret :form form :children (into [children] (map :init bes))}))

0 commit comments

Comments
 (0)
0