sx-http: fix homepage (bare symbol → fn call) + auto-quote slugs + resilient SSR

Homepage fix: path_expr "home" was evaluated as a symbol lookup (returning
the Lambda) instead of a function call. Now wraps bare symbols in a list:
home → (home) → calls the page function → returns component call.

Slug routing: auto_quote converts unknown symbols to strings before eval.
(etc (plan sx-host)) → (etc (plan "sx-host")) — resolves nested slug URLs.

Resilient SSR: render_to_buf catches Eval_error per-element and continues
rendering. Partial SSR output preserved even when some elements fail.

WASM kernel rebuilt (define shorthand + island placeholder changes).

Remaining: WASM kernel "Undefined symbol: let" — pre-existing bug in
client-side component-defs parsing. (list let ...) triggers symbol lookup
instead of special form recognition. Affects island hydration on all pages.

Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
This commit is contained in:
2026-03-28 18:41:56 +00:00
parent 303fc5c319
commit 39eb217c15
3 changed files with 41545 additions and 1762 deletions

View File

@@ -266,9 +266,7 @@ and render_list_to_html head args env =
| _ ->
let result = Sx_ref.eval_expr (List (head :: args)) (Env env) in
do_render_to_html result env)
with Eval_error _ ->
let result = Sx_ref.eval_expr (List (head :: args)) (Env env) in
do_render_to_html result env)
with Eval_error _ -> "")
| _ ->
let result = Sx_ref.eval_expr (List (head :: args)) (Env env) in
do_render_to_html result env
@@ -513,12 +511,16 @@ and render_list_buf buf head args env =
| _ ->
let result = Sx_ref.eval_expr (List (head :: args)) (Env env) in
render_to_buf buf result env)
with Eval_error _ ->
let result = Sx_ref.eval_expr (List (head :: args)) (Env env) in
render_to_buf buf result env)
with Eval_error msg ->
(* Unknown symbol/component — skip silently during SSR.
The client will render from page-sx. *)
Printf.eprintf "[ssr-skip] %s\n%!" msg)
| _ ->
let result = Sx_ref.eval_expr (List (head :: args)) (Env env) in
render_to_buf buf result env
(try
let result = Sx_ref.eval_expr (List (head :: args)) (Env env) in
render_to_buf buf result env
with Eval_error msg ->
Printf.eprintf "[ssr-skip] %s\n%!" msg)
and render_element_buf buf tag args env =
let (attrs, children) = parse_element_args args env in