Replace invoke with cek-call in adapters and engine
Completes the invoke→cek-call migration across all spec .sx files: - adapter-sx.sx: map/filter/for-each in aser wire format - adapter-dom.sx: island render update-fn - engine.sx: fetch transform callback - test-cek-reactive.sx: disposal test Only async-invoke (adapter-async.sx) remains — separate async pattern. Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
This commit is contained in:
@@ -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);
|
||||
|
||||
@@ -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))))))
|
||||
|
||||
|
||||
;; --------------------------------------------------------------------------
|
||||
|
||||
@@ -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))
|
||||
|
||||
|
||||
@@ -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
|
||||
|
||||
@@ -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:
|
||||
|
||||
@@ -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)))))
|
||||
|
||||
Reference in New Issue
Block a user