|
437 | 437 | `(aset ~'&b ~(idx-symbols i) (evalme ~(node-symbols i) ~'&b )))
|
438 | 438 | (evalme ~'body-node ~'&b)))])))))))
|
439 | 439 |
|
| 440 | +(def ^:const max-loop-bindings 24) |
440 | 441 | (defmethod seq->eval-node 'loop* seq-eval-loop [iden->idx _ [_ bindings & bodies :as def]]
|
441 | 442 | (assert (even? (count bindings)))
|
442 | 443 | (assert (vector? (::symbol-loop (meta def))))
|
443 | 444 | (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)) |
445 | 446 | 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))] |
450 | 450 | (case (count bindings)
|
451 | 451 | ~@(mapcat seq
|
452 |
| - (for [i (range 6)] |
| 452 | + (for [i (range (inc max-loop-bindings))] |
453 | 453 | [(* 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#))))))])))))) |
462 | 464 |
|
463 | 465 | (defmethod seq->eval-node 'new seq-eval-new [&a recur-indices [_ class-name & args]]
|
464 | 466 | (let [clz (symbol->class class-name)
|
|
0 commit comments