2 Commits

Author SHA1 Message Date
2aa0f1d010 Merge evalCond scheme-style fix
All checks were successful
Build and Deploy / build-and-deploy (push) Successful in 3m15s
2026-03-06 16:49:51 +00:00
a2d0a8a0fa Fix evalCond in HTML/DOM renderers: handle scheme-style cond clauses
The platform evalCond helper (used by render-to-html and render-to-dom)
only handled clojure-style (test body test body ...) but components use
scheme-style ((test body) (test body) ...). This caused "Not callable:
true" errors when rendering cond with nested clause pairs, breaking the
test dashboard and any page using scheme-style cond.

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
2026-03-06 16:49:42 +00:00
2 changed files with 34 additions and 10 deletions

View File

@@ -506,11 +506,23 @@
return local; return local;
} }
function evalCond(clauses, env) { function evalCond(clauses, env) {
for (var i = 0; i < clauses.length; i += 2) { // Detect scheme-style ((test body) ...) vs clojure-style (test body test body ...)
var test = clauses[i]; var scheme = clauses.length > 0 && Array.isArray(clauses[0]) && clauses[0].length === 2;
if (isSym(test) && test.name === ":else") return clauses[i + 1]; if (scheme) {
if (isKw(test) && test.name === "else") return clauses[i + 1]; for (var i = 0; i < clauses.length; i++) {
if (isSxTruthy(trampoline(evalExpr(test, env)))) return clauses[i + 1]; var clause = clauses[i];
var test = clause[0], body = clause[1];
if (isSym(test) && (test.name === "else" || test.name === ":else")) return body;
if (isKw(test) && test.name === "else") return body;
if (isSxTruthy(trampoline(evalExpr(test, env)))) return body;
}
} else {
for (var i = 0; i < clauses.length; i += 2) {
var test = clauses[i];
if (isSym(test) && test.name === ":else") return clauses[i + 1];
if (isKw(test) && test.name === "else") return clauses[i + 1];
if (isSxTruthy(trampoline(evalExpr(test, env)))) return clauses[i + 1];
}
} }
return null; return null;
} }

View File

@@ -1836,11 +1836,23 @@ PLATFORM_JS_POST = '''
return local; return local;
} }
function evalCond(clauses, env) { function evalCond(clauses, env) {
for (var i = 0; i < clauses.length; i += 2) { // Detect scheme-style ((test body) ...) vs clojure-style (test body test body ...)
var test = clauses[i]; var scheme = clauses.length > 0 && Array.isArray(clauses[0]) && clauses[0].length === 2;
if (isSym(test) && test.name === ":else") return clauses[i + 1]; if (scheme) {
if (isKw(test) && test.name === "else") return clauses[i + 1]; for (var i = 0; i < clauses.length; i++) {
if (isSxTruthy(trampoline(evalExpr(test, env)))) return clauses[i + 1]; var clause = clauses[i];
var test = clause[0], body = clause[1];
if (isSym(test) && (test.name === "else" || test.name === ":else")) return body;
if (isKw(test) && test.name === "else") return body;
if (isSxTruthy(trampoline(evalExpr(test, env)))) return body;
}
} else {
for (var i = 0; i < clauses.length; i += 2) {
var test = clauses[i];
if (isSym(test) && test.name === ":else") return clauses[i + 1];
if (isKw(test) && test.name === "else") return clauses[i + 1];
if (isSxTruthy(trampoline(evalExpr(test, env)))) return clauses[i + 1];
}
} }
return null; return null;
} }