aser in SX doesn't have access to helper/now/state-get. eval-expr
evaluates the body in the current env, returns the AST. The OCaml
handler interception then calls aser server-side with the full env.
Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
Handler closure env didn't have HTML tags (code, span, div etc.)
causing Undefined symbol errors. aser without explicit env uses
the global env which has all tags registered.
Also reverts oob-code highlight change (code tag not available in
aser context).
Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
Handler bodies contain HTML elements (div, p, span) which need the
render pipeline. eval-expr treats them as function calls. aser
evaluates and serializes HTML to wire format.
Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
env-get requires (env-get env name) with two args but dispatch.sx
was calling it with one arg, always returning nil. Now uses
eval-expr + make-symbol to resolve the handler binding in the
current env, with cek-try fallback to nil.
Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
api and call-handler now use (error ...) for not-found and method
mismatch, so error boundaries catch them properly instead of
rendering error messages as page content.
Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
OCaml server:
- Accept POST/PUT/PATCH/DELETE for /sx/ paths (was GET-only)
- Parse request body, query string, set per-request context
- Add 16 request primitives: now, state-get/set!, request-form/arg,
request-json, request-header(s), request-method/body, into, etc.
- URL-encoded body parser for form submissions
Handler dispatch (sx/sx/handlers/dispatch.sx):
- `api` function routes URL paths like (api "click") to handler:ex-click
- `call-handler` checks HTTP method, binds params, evaluates body
- Handlers defined via defhandler in handlers/examples.sx now reachable
Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>