From 014a192c5d206110c3317f79a2ec6b02f8abc76e Mon Sep 17 00:00:00 2001 From: dimgigov Date: Tue, 12 May 2026 18:55:27 +0300 Subject: [PATCH] fix(runtime): cljAssocIn handles vectors as keys path fix(emitter): remove contains? from special-forms list (handled elsewhere) --- lib/cljnim_runtime.nim | 15 +++++++++------ src/emitter.nim | 2 +- 2 files changed, 10 insertions(+), 7 deletions(-) diff --git a/lib/cljnim_runtime.nim b/lib/cljnim_runtime.nim index 56598db..b60f6e0 100644 --- a/lib/cljnim_runtime.nim +++ b/lib/cljnim_runtime.nim @@ -2080,12 +2080,15 @@ proc cljUpdate*(m: CljVal, key: CljVal, f: CljVal, extra: seq[CljVal] = @[]): Cl else: raise newException(CatchableError, "update requires a function") proc cljAssocIn*(m: CljVal, keys: CljVal, val: CljVal): CljVal = - if keys.isNil or keys.kind != ckList or keys.listItems.len == 0: - return m - if keys.listItems.len == 1: - return cljAssoc(m, keys.listItems[0], val) - let firstKey = keys.listItems[0] - let restKeys = cljList(keys.listItems[1..^1]) + if keys.isNil: return m + let isList = keys.kind == ckList or keys.kind == ckVector + if not isList: return m + let keyItems = if keys.kind == ckList: keys.listItems else: keys.vecData.toSeq + if keyItems.len == 0: return m + if keyItems.len == 1: + return cljAssoc(m, keyItems[0], val) + let firstKey = keyItems[0] + let restKeys = cljList(keyItems[1..^1]) let inner = cljGet(m, firstKey) let updated = cljAssocIn(inner, restKeys, val) cljAssoc(m, firstKey, updated) diff --git a/src/emitter.nim b/src/emitter.nim index 46206ef..4fa7920 100644 --- a/src/emitter.nim +++ b/src/emitter.nim @@ -2107,7 +2107,7 @@ proc emitSpecialForm(items: seq[CljVal], indent: int, needsValue: bool = false): "to-array", "into-array", "vector", "rand", "rand-int", "rand-nth", "random-sample", "assoc", "dissoc", "get", "get-in", "update", "assoc-in", - "contains?", "select-keys", + "select-keys", "disj", "peek", "pop", "transduce", "ex-info", "compare", "subvec",