Fix call-lambda signal mutation, rebuild browser JS, reformat reactive-islands

- sx_browser.ml: use cek_call instead of sx_call in call-lambda to
  avoid eval_expr deep-copying Dict values (breaks signal mutation)
- sx-browser.js: rebuilt with latest transpiler changes
- reactive-islands/index.sx: pretty-printed (no semantic changes)

Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
This commit is contained in:
2026-03-31 10:05:02 +00:00
parent 141a351acc
commit d26029fee2
3 changed files with 855 additions and 410 deletions

View File

@@ -705,8 +705,10 @@ let () =
bind "call-lambda" (fun args ->
match args with
| [f; a; _] | [f; a] when is_callable f ->
let arg_list = match a with List l -> l | Nil -> [] | v -> [v] in
Sx_ref.trampoline (Sx_runtime.sx_call f arg_list)
(* Use cek_call instead of sx_call to avoid eval_expr copying
Dict values (signals). sx_call returns a Thunk resolved via
eval_expr which deep-copies dicts, breaking signal mutation. *)
Sx_ref.cek_call f a
| _ -> raise (Eval_error "call-lambda: expected (fn args env?)"));
bind "cek-call" (fun args ->
match args with

View File

@@ -24,7 +24,7 @@
// =========================================================================
var NIL = Object.freeze({ _nil: true, toString: function() { return "nil"; } });
var SX_VERSION = "2026-03-31T08:20:17Z";
var SX_VERSION = "2026-03-31T09:56:06Z";
function isNil(x) { return x === NIL || x === null || x === undefined; }
function isSxTruthy(x) { return x !== false && !isNil(x); }

File diff suppressed because it is too large Load Diff