Add `_hs-command-registry` and `_hs-converter-registry` dicts plus `hs-register-command!` / `hs-register-converter!` to `lib/hyperscript/compiler.sx`. Inside `hs-to-sx`, before the existing `cond` over head symbols, check both registries: an `as` form whose type-name has a registered converter dispatches to that converter; any list head whose name (`(str head)`) is in the command registry dispatches to that compile-fn. On registry miss, the original ~180 hardcoded branches handle the form. Each registered fn receives a ctx dict (built per call) exposing `:hs-to-sx` for recursion plus the AST fields the dispatch needs (`:ast :head` for commands; `:ast :value-ast :type-name` for converters). Mirrors Step 9's parser feature registry shape. Smoke tested: register custom command + converter, both dispatch; built-in `(as x \"Int\")` still produces `(hs-coerce x \"Int\")`. Mirror `shared/static/wasm/sx/hs-compiler.sx` copied byte-identical. OCaml: 4545/1339, JS: 2591/2465 — both match baseline, zero regressions. Second piece of plans/designs/hs-plugin-system.md (Step 11 next). Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
115 KiB
115 KiB