2012-02-22 5 views
3

clojureの一時的なマップからどのようにキーを取得しますか?私は、過渡マップ内のすべてのキーの配列を取得しようとしています

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

を与える:私は期待していますがよう

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

を与えます同じメモで、一時的なマップを使ってどのように処理するのですか?

(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!'とそのタイプの操作だけに本当に良いものであるかのようです。ありがとう –

1

を与える私はあなたが永続的な構造に働くようにトランジェント上で動作する方法はないと思います。あなたはpersistence!

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

あなたはClojure docsから過渡状態についての詳細を学ぶことができるとあなたのトランジェントからの永続的な構造を作成する必要があります。

関連する問題