From 121aa30f327b0273099faf1497659b33723ee7d8 Mon Sep 17 00:00:00 2001 From: giles Date: Wed, 4 Mar 2026 15:15:50 +0000 Subject: [PATCH] Fix contains? primitive to handle strings in both JS and Python The JS contains? used `k in c` which throws TypeError on strings. The Python version silently returned False for strings. Both now use indexOf/`in` for substring matching on strings. Fixes: sx.js MOUNT PARSE ERROR on blog index where (contains? current-local-href "?") was evaluated client-side. Co-Authored-By: Claude Opus 4.6 --- shared/static/scripts/sx.js | 2 +- shared/sx/primitives.py | 2 ++ 2 files changed, 3 insertions(+), 1 deletion(-) diff --git a/shared/static/scripts/sx.js b/shared/static/scripts/sx.js index d919f2b..f92f056 100644 --- a/shared/static/scripts/sx.js +++ b/shared/static/scripts/sx.js @@ -302,7 +302,7 @@ PRIMITIVES["list?"] = function (x) { return Array.isArray(x); }; PRIMITIVES["dict?"] = function (x) { return x !== null && typeof x === "object" && !Array.isArray(x) && !x._sym && !x._kw; }; PRIMITIVES["empty?"] = function (c) { return !c || (Array.isArray(c) ? c.length === 0 : Object.keys(c).length === 0); }; - PRIMITIVES["contains?"] = function (c, k) { return Array.isArray(c) ? c.indexOf(k) !== -1 : k in c; }; + PRIMITIVES["contains?"] = function (c, k) { return typeof c === "string" ? c.indexOf(k) !== -1 : Array.isArray(c) ? c.indexOf(k) !== -1 : k in c; }; PRIMITIVES["odd?"] = function (n) { return n % 2 !== 0; }; PRIMITIVES["even?"] = function (n) { return n % 2 === 0; }; PRIMITIVES["zero?"] = function (n) { return n === 0; }; diff --git a/shared/sx/primitives.py b/shared/sx/primitives.py index d903587..3a2d0ee 100644 --- a/shared/sx/primitives.py +++ b/shared/sx/primitives.py @@ -196,6 +196,8 @@ def prim_is_empty(coll: Any) -> bool: @register_primitive("contains?") def prim_contains(coll: Any, key: Any) -> bool: + if isinstance(coll, str): + return str(key) in coll if isinstance(coll, dict): k = key.name if isinstance(key, Keyword) else key return k in coll