Skip to content

Commit 525ac92

Browse files
committed
feat: max-loop-bindings var
1 parent 1792671 commit 525ac92

File tree

1 file changed

+16
-14
lines changed

1 file changed

+16
-14
lines changed

src/uclj/core.clj

+16-14
Original file line numberDiff line numberDiff line change
@@ -437,28 +437,30 @@
437437
`(aset ~'&b ~(idx-symbols i) (evalme ~(node-symbols i) ~'&b )))
438438
(evalme ~'body-node ~'&b)))])))))))
439439

440+
(def ^:const max-loop-bindings 24)
440441
(defmethod seq->eval-node 'loop* seq-eval-loop [iden->idx _ [_ bindings & bodies :as def]]
441442
(assert (even? (count bindings)))
442443
(assert (vector? (::symbol-loop (meta def))))
443444
(assert (every? symbol? (::symbol-loop (meta def))))
444-
(let [[node0 node1 node2 node3 node4 node5] (for [[k v] (partition 2 bindings)] (->eval-node iden->idx nil v))
445+
(let [bindings-nodes (for [[_ v] (partition 2 bindings)] (->eval-node iden->idx nil v))
445446
recur-indices (mapv iden->idx (::symbol-loop (meta def)))
446-
body-node (seq->eval-node iden->idx recur-indices (list* 'do bodies))
447-
[idx0 idx1 idx2 idx3 idx4 idx5] recur-indices]
448-
(template [idx-symbols (mapv #(symbol (str 'idx %)) (range 20))
449-
node-symbols (mapv #(symbol (str 'node %)) (range 20))]
447+
body-node (seq->eval-node iden->idx recur-indices (list* 'do bodies))]
448+
(template [idx-symbols (mapv #(symbol (str 'idx %)) (range max-loop-bindings))
449+
node-symbols (mapv #(symbol (str 'node %)) (range max-loop-bindings))]
450450
(case (count bindings)
451451
~@(mapcat seq
452-
(for [i (range 6)]
452+
(for [i (range (inc max-loop-bindings))]
453453
[(* 2 i)
454-
`(gen-eval-node
455-
(do ~@(for [i (range i)]
456-
`(aset ~'&b ~(idx-symbols i) (evalme ~(node-symbols i) ~'&b )))
457-
(loop []
458-
(let [result# (evalme ~'body-node ~'&b)]
459-
(if (identical? ::recur result#)
460-
(recur)
461-
result#)))))]))))))
454+
`(let [[~@(take i node-symbols)] ~'bindings-nodes
455+
[~@(take i idx-symbols)] ~'recur-indices]
456+
(gen-eval-node
457+
(do ~@(for [i (range i)]
458+
`(aset ~'&b ~(idx-symbols i) (evalme ~(node-symbols i) ~'&b )))
459+
(loop []
460+
(let [result# (evalme ~'body-node ~'&b)]
461+
(if (identical? ::recur result#)
462+
(recur)
463+
result#))))))]))))))
462464

463465
(defmethod seq->eval-node 'new seq-eval-new [&a recur-indices [_ class-name & args]]
464466
(let [clz (symbol->class class-name)

0 commit comments

Comments
 (0)