diff --git a/shared/static/scripts/sx-browser.js b/shared/static/scripts/sx-browser.js index 40d3993..f4ce87a 100644 --- a/shared/static/scripts/sx-browser.js +++ b/shared/static/scripts/sx-browser.js @@ -506,11 +506,23 @@ return local; } function evalCond(clauses, env) { - 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]; + // Detect scheme-style ((test body) ...) vs clojure-style (test body test body ...) + var scheme = clauses.length > 0 && Array.isArray(clauses[0]) && clauses[0].length === 2; + if (scheme) { + for (var i = 0; i < clauses.length; i++) { + 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; } diff --git a/shared/sx/ref/bootstrap_js.py b/shared/sx/ref/bootstrap_js.py index c9fec06..2667497 100644 --- a/shared/sx/ref/bootstrap_js.py +++ b/shared/sx/ref/bootstrap_js.py @@ -1836,11 +1836,23 @@ PLATFORM_JS_POST = ''' return local; } function evalCond(clauses, env) { - 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]; + // Detect scheme-style ((test body) ...) vs clojure-style (test body test body ...) + var scheme = clauses.length > 0 && Array.isArray(clauses[0]) && clauses[0].length === 2; + if (scheme) { + for (var i = 0; i < clauses.length; i++) { + 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; }