A loop binding whose init is double and whose every recur arg stays double (a bounded monotone fixpoint) is typed :double, so its arithmetic — and the recur args feeding it — emit fl-ops. Chez can then keep the accumulator unboxed in a float register across the loop. Integer loop vars stay untyped: a bare integer init never seeds :long (same rule as round 1), so a bignum-producing loop keeps arbitrary precision rather than overflowing a fixnum. recur-kinds walks only tail position (if/do-ret/let-body), stopping at nested loop/fn so a loop sees only its own recur. A/B on a loop-carried double accumulator: 735ms generic -> 500ms typed (1.47x), closing the gap to the JVM from ~3.3x to ~2.2x. The integer counter stays generic, which is most of the residual. |
||
|---|---|---|
| .. | ||
| clojure/core | ||
| jolt | ||