diff --git a/lib/forth/compiler.sx b/lib/forth/compiler.sx index 8a9e7300..1d744ce3 100644 --- a/lib/forth/compiler.sx +++ b/lib/forth/compiler.sx @@ -34,6 +34,10 @@ ;; to the prior X — matching standard Forth redefinition semantics. ;; RECURSE is the one exception: it stays late-bound against the not-yet- ;; installed current definition. +;; Inline primitive calls: skip the `forth-execute-word` indirection by +;; appending the word's body fn directly (forth-execute-word body +;; reduces to `((get w "body") state)`, which is exactly what the body +;; fn already is). Saves one frame per call op in every colon-def. (define forth-compile-call (fn @@ -43,9 +47,7 @@ (if (nil? w) (forth-error state (str name " ?")) - (let - ((op (fn (s) (forth-execute-word s w)))) - (forth-def-append! state op)))))) + (forth-def-append! state (get w "body")))))) (define forth-compile-recurse diff --git a/lib/forth/scoreboard.json b/lib/forth/scoreboard.json index 104667a0..5f7d0569 100644 --- a/lib/forth/scoreboard.json +++ b/lib/forth/scoreboard.json @@ -1,6 +1,6 @@ { "source": "gerryjackson/forth2012-test-suite src/core.fr", - "generated_at": "2026-04-25T03:32:23Z", + "generated_at": "2026-04-25T04:00:01Z", "chunks_available": 638, "chunks_fed": 638, "total": 638, diff --git a/lib/forth/scoreboard.md b/lib/forth/scoreboard.md index 076789e1..ad1b1fc6 100644 --- a/lib/forth/scoreboard.md +++ b/lib/forth/scoreboard.md @@ -11,7 +11,7 @@ | percent | 96% | - **Source**: `gerryjackson/forth2012-test-suite` `src/core.fr` -- **Generated**: 2026-04-25T03:32:23Z +- **Generated**: 2026-04-25T04:00:01Z - **Note**: completed A "chunk" is any preprocessed segment ending at a `}T` (every Hayes test diff --git a/plans/forth-on-sx.md b/plans/forth-on-sx.md index 5c79cd7d..243830a2 100644 --- a/plans/forth-on-sx.md +++ b/plans/forth-on-sx.md @@ -98,7 +98,7 @@ Representation: - [x] Target: 100% Hayes Core (97% achieved — remaining 5 errors all in `GI5`'s multi-`WHILE`-per-`BEGIN` non-standard pattern, plus one stuck `dict-set!` chunk and 14 numeric-edge fails) ### Phase 6 — speed -- [ ] Inline primitive calls during compile (skip dict lookup) +- [x] Inline primitive calls during compile (skip dict lookup) - [ ] Tail-call optimise colon-def endings - [ ] JIT cooperation: mark compiled colon-defs as VM-eligible @@ -106,6 +106,17 @@ Representation: _Newest first._ +- **Phase 6 — inline primitive calls (Hayes unchanged at 618/638).** + `forth-compile-call` now appends the looked-up word's body fn + directly to the colon-def body instead of wrapping it in + `(fn (s) (forth-execute-word s w))`. `forth-execute-word body` + reduces to `((get w "body") state)`, so the wrapper added an + extra closure + `get` per call op for no behavioural gain. Same + early-binding semantics: the body fn is captured at compile time, + so later redefinitions of the same name don't retroactively + change existing definitions. All 306 internal tests still green; + Hayes Core stays at 618/638. Pure optimisation. + - **Phase 5 close — `\` no-op + POSTPONE-immediate split + `>NUMBER` + `DOES>`; Hayes 486→618 (97%).** Big closing-out iteration. Made `\` IMMEDIATE so `POSTPONE \` (Hayes' IFFLOORED/IFSYM gate)