2012-02-22 21 views
3

我试图让所有的键的序列中的一个短暂的地图:如何从clojure中的瞬态地图获取密钥?

(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> 

回答

6

由于懒惰和易变性之间的相互作用,这并不是真正可行的。 (keys m)总是返回一个由不可变的m数据结构支持的惰性序列,并根据需要计算元素。但是,如果m是暂时的,它可能随时改变,这会破坏懒惰的键序列。你真的不想做任何太瞬变的事情;并且因为创建数据结构的暂时版本或持久版本非常便宜,如果您真的想要做某些事情,那么来回几次并不是太繁重。

+0

我会暂时与此一起。看起来好像临时映射对于'assoc!','conj!'和那种类型的操作只是非常好的。谢谢 – 2012-02-22 19:41:05

1

我不认为有一种方法,就像你上永久性结构上工作的瞬态工作。您需要创建从您的瞬变持久的结构persistence!

user> (map identity (persistent! (transient {3 4 5 6}))) 
([3 4] [5 6]) 

您可以了解更多关于瞬变Clojure docs