|
29 | 29 |
|
30 | 30 | (run! require namespaces-to-require)
|
31 | 31 |
|
32 |
| -(def ^:private ^:dynamic *template-vars* {}) |
| 32 | +(def ^:dynamic *template-vars* {}) |
33 | 33 | (defn- template* [bindings expr]
|
34 | 34 | (assert (vector? bindings))
|
35 | 35 | (letfn [(unroll [expr] (cond (seq? expr) (unroll-seq expr)
|
|
401 | 401 | [arity (->eval-node iden->idx recur-indices (list* 'do bodies))]))]
|
402 | 402 | (make-fn-body fname symbol-used arity->body-node arity->symbols-introduced iden->idx vararg-arity)))
|
403 | 403 |
|
| 404 | +(def ^:const max-let-bindings 32) |
| 405 | + |
404 | 406 | (defmethod seq->eval-node 'let* seq-eval-let [iden->idx recur-indices [_ bindings & bodies :as form]]
|
405 | 407 | (cond
|
406 | 408 | ;; can merge (let*) forms
|
407 |
| - (and (= 1 (count bodies)) (seq? (first bodies)) (= 'let* (ffirst bodies))) |
| 409 | + (and (= 1 (count bodies)) |
| 410 | + (< (count bindings) (* 2 max-let-bindings)) |
| 411 | + (seq? (first bodies)) (= 'let* (ffirst bodies))) |
408 | 412 | (recur iden->idx recur-indices (list* 'let*
|
409 |
| - (into bindings (second (first bodies))) |
410 |
| - (nnext (first bodies)))) |
411 |
| - |
| 413 | + (into bindings (second (first bodies))) |
| 414 | + (nnext (first bodies)))) |
| 415 | + ;; it must have at most max-let-bindings binding vars |
| 416 | + (> (count bindings) (* 2 max-let-bindings)) |
| 417 | + (recur iden->idx recur-indices |
| 418 | + (list 'let* |
| 419 | + (vec (take (* 2 max-let-bindings) bindings)) |
| 420 | + (list* 'let* |
| 421 | + (vec (drop (* 2 max-let-bindings) bindings)) |
| 422 | + bodies))) |
412 | 423 | :else
|
413 |
| - (template [idx-symbols (mapv #(symbol (str 'idx- %)) (range 20)) |
414 |
| - node-symbols (mapv #(symbol (str 'node- %)) (range 20))] |
| 424 | + (template [idx-symbols (mapv #(symbol (str 'idx- %)) (range max-let-bindings)) |
| 425 | + node-symbols (mapv #(symbol (str 'node- %)) (range max-let-bindings))] |
415 | 426 | (let [[~@(map vector idx-symbols node-symbols)]
|
416 | 427 | (for [[k v] (partition 2 bindings)]
|
417 | 428 | [(int (iden->idx (::symbol-identity (meta k))))
|
418 | 429 | (->eval-node iden->idx nil v)])
|
419 | 430 | body-node (seq->eval-node iden->idx recur-indices (list* 'do bodies))]
|
420 | 431 | (case (count bindings)
|
421 | 432 | ~@(mapcat seq
|
422 |
| - (for [i (range 20)] |
| 433 | + (for [i (range (inc max-let-bindings))] |
423 | 434 | [(* 2 i)
|
424 | 435 | `(gen-eval-node
|
425 | 436 | (do ~@(for [i (range i)]
|
|
0 commit comments