2012-02-22 47 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