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",