2

clojure でトランジェントを使用することに少し迷っています。どんな助けでも大歓迎です。サンプルコード:

(defn test-transient [v]
    (let [b (transient [])]
        (for [x v] (conj! b x))
        (persistent! b)))

user> (test-transient [1 2 3])
[]

戻る前に永続化しようとしましたが、結果は次のとおりです。

(defn test-transient2 [v]
    (let [b (transient [])]
        (for [x v] (conj! b x))
        (persistent! b)
        b))

user> (test-transient2 [1 2 3])
#<TransientVector clojure.lang.PersistentVector$TransientVector@1dfde20>

しかし、conjを使用すると!別々にそれはうまくいくようです:

(defn test-transient3 [v]
    (let [b (transient [])]
    (conj! b 0)
    (conj! b 1)
    (conj! b 2)
    (persistent! b)))

user> (test-transient3 [1 2 3])
[0 1 2]

for には何らかの制約がありますか? もしそうなら、どうすれば永続的なベクトルからトランジェントに値をコピーできますか?

ありがとうございました。

4

1 に答える 1

6

トランジェントはその場でバッシュされるべきではありません。最後の例は、依存すべきではない実装の詳細のためにのみ機能します。

for動作しない理由は、それが怠け者であり、conj!呼び出しが実行されないためですが、とにかくトランジェントをそのように扱うべきではないため、それは重要ではありません。

不変ベクトルで「通常」を使用するのと同じ方法、つまり戻り値を使用する必要conj!があります。conj

あなたがやろうとしていることは、次のように達成できます:

(defn test-transient [v]
  (let [t (transient [])]
    (persistent! (reduce conj! t v))))
于 2012-09-12T10:51:04.837 に答える