Chez Phase 1 (increment 3g): letfn + declare/def-no-init
Closes the last two non-host-interop prelude emit gaps. letfn now analyzes to a :let node flagged :letrec — the binding fns are bound into the env together before any spec is analyzed, so siblings and self resolve. The Chez back end lowers it to letrec*; the Janet back end punts it at emit (its sequential let* can't express the mutual recursion — same interpreter fallback as before, just decided at emit-ir instead of analyze). (def x) with no init (declare) analyzes to a :def with :no-init instead of punting. Chez reserves the var cell via declare-var! (which doesn't clobber an existing root — (do (def x 7) (def x) x) => 7); the Janet back end still punts to the interpreter, which interns a genuinely-unbound var. fallback-zero-test now checks emit-ir too, not just analyze-form, so the real compile-vs-interpret decision is what it asserts (letfn/def-no-init analyze but the Janet back end punts them). letfn stays in must-punt with an updated note. Prelude emit reach 342 -> 348/355 (40-lazy now 13/13); Chez subset 664 -> 672, 0 divergences; emit-test 110 -> 117. Full gate green.
This commit is contained in:
parent
930800f9a6
commit
0f7d2753a8
8 changed files with 119 additions and 31 deletions
|
|
@ -48,13 +48,14 @@ compile-time signal) and are counted "out of subset", not as divergences.
|
|||
|
||||
JOLT_CHEZ_CORPUS=1 janet test/chez/run-corpus-chez.janet
|
||||
|
||||
Baseline after inc 3f (quoted literals): **664/664 compiled cases pass**, 0
|
||||
divergences; 1994/2658 out of subset (await clojure.core on Chez). Inc 3e
|
||||
Baseline after inc 3g (letfn + declare): **672/672 compiled cases pass**, 0
|
||||
divergences; 1986/2658 out of subset (await clojure.core on Chez). Inc 3e
|
||||
(throw/try + ex-info) was 632/632; inc 3f's quote support + a seq.ss fix (empty
|
||||
`map`/`filter` results are `()` not nil, matching Clojure) pulled 32 more corpus
|
||||
cases into the subset. `emit-fn` lowers multi-arity fns to a Scheme `case-lambda`
|
||||
and variadic fns to a rest-arg lambda (rest list coerced to a jolt seq, nil when
|
||||
empty).
|
||||
`map`/`filter` results are `()` not nil, matching Clojure) reached 664/664; inc 3g
|
||||
(letfn -> Scheme `letrec*`, declare/def-no-init -> a reserved var cell) pulled 8
|
||||
more corpus cases into the subset. `emit-fn` lowers multi-arity fns to a Scheme
|
||||
`case-lambda` and variadic fns to a rest-arg lambda (rest list coerced to a jolt
|
||||
seq, nil when empty).
|
||||
|
||||
## Phase 1 — clojure.core prelude emission (inc 3d, jolt-ocvi)
|
||||
The `-e`-capable jolt-chez path: emit the clojure.core tiers
|
||||
|
|
|
|||
Loading…
Add table
Add a link
Reference in a new issue