ludic/changes/toolchain-r3-fixes.md
Orkuncakilkaya 8cf4b3fed6 fix(lang): the action drain is the program's; --check runs every check a build makes; a registry key named count is refused; name lookups are tables
- the function that calls every reducer (and the action queue) is written in the program's own
  file: in the first action's file it belonged to that module, depended on every module with a
  reducer, and joined a game's modules into one 69-module cycle (examples/actions/modules and a
  ludic deps case hold it); the state instances, the queue and the reducers make no deps edges
- ludicc --check / ludic build --check lower the program too and write nothing, so the code
  writer's refusals are in it: a bind to a function that is gone, an unknown name (and the checker
  now refuses fn <missing> itself); rejects bind_missing_fn, unknown_name, registry_count_key
- def R count is refused: its constant would be PREFIX_COUNT, the registry's size
- a file's module, package, trust and numbers-float are tables, and from the check on the lookups
  of functions, enums, records, globals and externs are too (tagged enums kept as a list): Maroon
  Lake's check-only build went from about 20 s to 7 s including lowering, its IR from about 2
  minutes to under 10 s; duplicate declarations are found by table, not a pair of loops
- threads.ludic's pool check gives each call a little work, so a busy machine cannot run them all
  on the caller before a worker wakes (it failed one run in three under load)

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
2026-09-25 23:34:43 +03:00

10 lines
856 B
Markdown

bump: patch
type: fix
**The action drain is the program's; `--check` is every check; `count` is not a registry key.**
The function that calls every reducer is written in the program's own file, so the module that
declares the actions no longer depends on every module that reduces them (a game's `base` joined a
69-module cycle). `ludic build --check` runs the code writer's checks too - a bind to a function that
is gone, an unknown name - and still writes nothing. A registry entry keyed `count` is refused
(`def Tools count: its constant would be TL_COUNT, which is the registry's size`). And a big
program builds much faster: the emitter's and the checker's lookups by name are tables, not walks of
the whole program (on Maroon Lake a check-only build, lowering included, went from about 20 s to under 10 s, its IR from about 2 minutes to under 10 s).