Restructure SX ref spec into core + selectable adapters

Split monolithic render.sx into core (tag registries, shared utils) plus
four adapter .sx files: adapter-html (server HTML strings), adapter-sx
(SX wire format), adapter-dom (browser DOM nodes), and engine (SxEngine
triggers, morphing, swaps). All adapters written in s-expressions with
platform interface declarations for JS bridge functions.

Bootstrap compiler now accepts --adapters flag to emit targeted builds:
  -a html        → server-only (1108 lines)
  -a dom,engine  → browser-only (1634 lines)
  -a html,sx     → server with SX wire (1169 lines)
  (default)      → all adapters (1800 lines)

Fixes: keyword arg i-counter desync in reduce across all adapters,
render-aware special forms (let/if/when/cond/map) in HTML adapter,
component children double-escaping, ~prefixed macro dispatch.

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
This commit is contained in:
2026-03-05 11:49:44 +00:00
parent a9526c4fa1
commit daeecab310
8 changed files with 3083 additions and 384 deletions

View File

@@ -446,7 +446,8 @@
(define parse-comp-params
(fn (params-expr)
;; Parse (&key param1 param2 &rest children) → (params has-children)
;; Parse (&key param1 param2 &children) → (params has-children)
;; Also accepts &rest as synonym for &children.
(let ((params (list))
(has-children false)
(in-key false))
@@ -455,12 +456,12 @@
(when (= (type-of p) "symbol")
(let ((name (symbol-name p)))
(cond
(= name "&key") (set! in-key true)
(= name "&rest") (set! has-children true)
(and in-key (not has-children))
(append! params name)
:else
(append! params name)))))
(= name "&key") (set! in-key true)
(= name "&rest") (set! has-children true)
(= name "&children") (set! has-children true)
has-children nil ;; skip params after &children/&rest
in-key (append! params name)
:else (append! params name)))))
params-expr)
(list params has-children))))