diff --git a/shared/static/scripts/sx-browser.js b/shared/static/scripts/sx-browser.js index 382fcb7..04172ec 100644 --- a/shared/static/scripts/sx-browser.js +++ b/shared/static/scripts/sx-browser.js @@ -14,7 +14,7 @@ // ========================================================================= var NIL = Object.freeze({ _nil: true, toString: function() { return "nil"; } }); - var SX_VERSION = "2026-03-14T10:06:04Z"; + var SX_VERSION = "2026-03-14T10:16:03Z"; function isNil(x) { return x === NIL || x === null || x === undefined; } function isSxTruthy(x) { return x !== false && !isNil(x); } @@ -1868,7 +1868,7 @@ return result; }, args); var local = envMerge(lambdaClosure(f), env); envSet(local, first(lambdaParams(f)), item); return aser(lambdaBody(f), local); -})() : invoke(f, item)); }, coll); +})() : cekCall(f, [item])); }, coll); })() : (isSxTruthy((name == "map-indexed")) ? (function() { var f = trampoline(evalExpr(first(args), env)); var coll = trampoline(evalExpr(nth(args, 1), env)); @@ -1877,7 +1877,7 @@ return result; }, args); envSet(local, first(lambdaParams(f)), i); envSet(local, nth(lambdaParams(f), 1), item); return aser(lambdaBody(f), local); -})() : invoke(f, i, item)); }, coll); +})() : cekCall(f, [i, item])); }, coll); })() : (isSxTruthy((name == "for-each")) ? (function() { var f = trampoline(evalExpr(first(args), env)); var coll = trampoline(evalExpr(nth(args, 1), env)); @@ -1886,7 +1886,7 @@ return result; }, args); var local = envMerge(lambdaClosure(f), env); envSet(local, first(lambdaParams(f)), item); return append_b(results, aser(lambdaBody(f), local)); -})() : invoke(f, item)); } } +})() : cekCall(f, [item])); } } return (isSxTruthy(isEmpty(results)) ? NIL : results); })() : (isSxTruthy((name == "defisland")) ? (trampoline(evalExpr(expr, env)), serialize(expr)) : (isSxTruthy(sxOr((name == "define"), (name == "defcomp"), (name == "defmacro"), (name == "defstyle"), (name == "defhandler"), (name == "defpage"), (name == "defquery"), (name == "defaction"), (name == "defrelation"), (name == "deftype"), (name == "defeffect"))) ? (trampoline(evalExpr(expr, env)), NIL) : (isSxTruthy((name == "scope")) ? (function() { var scopeName = trampoline(evalExpr(first(args), env)); @@ -2485,7 +2485,7 @@ return (isSxTruthy(testFn()) ? (function() { })(); return (function() { var initial = cekRun(makeCekState(expr, env, [makeReactiveResetFrame(env, updateFn, true)])); - return invoke(updateFn, initial); + return cekCall(updateFn, [initial]); })(); })(); }; @@ -2747,7 +2747,7 @@ return (function() { return (isSxTruthy((isSxTruthy(env) && isSxTruthy(newHtml) && !isSxTruthy(isEmpty(newHtml)))) ? (function() { var parsed = parse(newHtml); return (function() { - var sxContent = (isSxTruthy(transform) ? invoke(transform, parsed) : parsed); + var sxContent = (isSxTruthy(transform) ? cekCall(transform, [parsed]) : parsed); disposeMarshScope(oldMarsh); return withMarshScope(oldMarsh, function() { return (function() { var newDom = renderToDom(sxContent, env, NIL); diff --git a/shared/sx/ref/adapter-dom.sx b/shared/sx/ref/adapter-dom.sx index 23cad39..f8dd8e5 100644 --- a/shared/sx/ref/adapter-dom.sx +++ b/shared/sx/ref/adapter-dom.sx @@ -1146,7 +1146,7 @@ (let ((initial (cek-run (make-cek-state expr env (list (make-reactive-reset-frame env update-fn true)))))) - (invoke update-fn initial))))) + (cek-call update-fn (list initial)))))) ;; -------------------------------------------------------------------------- diff --git a/shared/sx/ref/adapter-sx.sx b/shared/sx/ref/adapter-sx.sx index 85f4f6a..9c6493c 100644 --- a/shared/sx/ref/adapter-sx.sx +++ b/shared/sx/ref/adapter-sx.sx @@ -291,7 +291,7 @@ (let ((local (env-merge (lambda-closure f) env))) (env-set! local (first (lambda-params f)) item) (aser (lambda-body f) local)) - (invoke f item))) + (cek-call f (list item)))) coll)) ;; map-indexed @@ -304,7 +304,7 @@ (env-set! local (first (lambda-params f)) i) (env-set! local (nth (lambda-params f) 1) item) (aser (lambda-body f) local)) - (invoke f i item))) + (cek-call f (list i item)))) coll)) ;; for-each — evaluate for side effects, aser each body @@ -317,7 +317,7 @@ (let ((local (env-merge (lambda-closure f) env))) (env-set! local (first (lambda-params f)) item) (append! results (aser (lambda-body f) local))) - (invoke f item))) + (cek-call f (list item)))) coll) (if (empty? results) nil results)) diff --git a/shared/sx/ref/engine.sx b/shared/sx/ref/engine.sx index e070536..898777e 100644 --- a/shared/sx/ref/engine.sx +++ b/shared/sx/ref/engine.sx @@ -530,7 +530,7 @@ (if (and env new-html (not (empty? new-html))) ;; Parse new content as SX and re-evaluate in island scope (let ((parsed (parse new-html))) - (let ((sx-content (if transform (invoke transform parsed) parsed))) + (let ((sx-content (if transform (cek-call transform (list parsed)) parsed))) ;; Dispose old reactive bindings in this marsh (dispose-marsh-scope old-marsh) ;; Evaluate the SX in a new marsh scope — creates new reactive bindings diff --git a/shared/sx/ref/sx_ref.py b/shared/sx/ref/sx_ref.py index 36aefd3..2a4a2b9 100644 --- a/shared/sx/ref/sx_ref.py +++ b/shared/sx/ref/sx_ref.py @@ -2893,11 +2893,11 @@ def aser_special(name, expr, env): elif sx_truthy((name == 'map')): f = trampoline(eval_expr(first(args), env)) coll = trampoline(eval_expr(nth(args, 1), env)) - return map(lambda item: ((lambda local: _sx_begin(_sx_dict_set(local, first(lambda_params(f)), item), aser(lambda_body(f), local)))(env_merge(lambda_closure(f), env)) if sx_truthy(is_lambda(f)) else invoke(f, item)), coll) + return map(lambda item: ((lambda local: _sx_begin(_sx_dict_set(local, first(lambda_params(f)), item), aser(lambda_body(f), local)))(env_merge(lambda_closure(f), env)) if sx_truthy(is_lambda(f)) else cek_call(f, [item])), coll) elif sx_truthy((name == 'map-indexed')): f = trampoline(eval_expr(first(args), env)) coll = trampoline(eval_expr(nth(args, 1), env)) - return map_indexed(lambda i, item: ((lambda local: _sx_begin(_sx_dict_set(local, first(lambda_params(f)), i), _sx_dict_set(local, nth(lambda_params(f), 1), item), aser(lambda_body(f), local)))(env_merge(lambda_closure(f), env)) if sx_truthy(is_lambda(f)) else invoke(f, i, item)), coll) + return map_indexed(lambda i, item: ((lambda local: _sx_begin(_sx_dict_set(local, first(lambda_params(f)), i), _sx_dict_set(local, nth(lambda_params(f), 1), item), aser(lambda_body(f), local)))(env_merge(lambda_closure(f), env)) if sx_truthy(is_lambda(f)) else cek_call(f, [i, item])), coll) elif sx_truthy((name == 'for-each')): f = trampoline(eval_expr(first(args), env)) coll = trampoline(eval_expr(nth(args, 1), env)) @@ -2908,7 +2908,7 @@ def aser_special(name, expr, env): local[first(lambda_params(f))] = item results.append(aser(lambda_body(f), local)) else: - invoke(f, item) + cek_call(f, [item]) if sx_truthy(empty_p(results)): return NIL else: diff --git a/shared/sx/ref/test-cek-reactive.sx b/shared/sx/ref/test-cek-reactive.sx index 3cf97b0..456501c 100644 --- a/shared/sx/ref/test-cek-reactive.sx +++ b/shared/sx/ref/test-cek-reactive.sx @@ -148,7 +148,7 @@ true))))) ;; Pop scope — call all disposers (scope-pop! "sx-island-scope") - (for-each (fn (d) (invoke d)) disposers) + (for-each (fn (d) (cek-call d nil)) disposers) ;; Change signal — no update should fire (reset! s 999) (assert-equal 0 (len update-calls)))))