你如何从clojure的瞬态地图中获取密钥?

时间:2012-02-22 14:45:24

标签: clojure

我正在尝试获取瞬态映射中所有键的seq:

(keys {3 4 5 6 7 8})提供(3 5 7)

正如我所料,但是:

(keys (transient {3 4 5 6 7 8}))

给出

#<CompilerException java.lang.IllegalArgumentException: Don't know how to create ISeq from: clojure.lang.PersistentArrayMap$TransientArrayMap (NO_SOURCE_FILE:346)>

在同一个音符上,我如何使用瞬态地图进行处理?

(map identity {3 4 5 6})

给出

([3 4] [5 6])

但是

(map identity (transient {3 4 5 6}))

给出

#<IllegalArgumentException java.lang.IllegalArgumentException: Don't know how to create ISeq from: clojure.lang.PersistentArrayMap$TransientArrayMap>

2 个答案:

答案 0 :(得分:6)

由于懒惰和可变性之间的相互作用,这实际上是不可能的。 (keys m)始终返回由不可变m数据结构支持的惰性序列,并根据需要计算元素。但如果m是一个瞬态,它可能随时改变,这会破坏懒惰的密钥序列。你真的打算不要做任何过于花哨的事情;而且因为创建数据结构的瞬态版本或持久版本非常便宜,如果你真的想要做一些奇特的事情,那么来回走动几次并不是太繁重。

答案 1 :(得分:1)

我认为有一种方法可以处理瞬态,就像你在持久性结构上工作一样。您需要使用persistence!

从瞬变中创建持久性结构
user> (map identity (persistent! (transient {3 4 5 6})))
([3 4] [5 6])

您可以从Clojure docs了解有关瞬变的更多信息。