Clojure瞬态使用

Clojure瞬态使用,clojure,Clojure,我对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 (tran

我对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>
for有一些限制吗?如果是这样,如何将值从持久向量复制到瞬态向量


谢谢。

瞬变不应该像那样被猛击。上一个示例仅适用于您不应该依赖的实现细节

for
不起作用的原因是它很懒,而且
连接调用永远不会执行,但这不是重点,因为无论如何,您都不应该以这种方式处理瞬态

你应该使用
conj
与使用不可变向量的“regular”
conj
的方法相同-使用返回值

您试图做的事情可以这样完成:

(defn test-transient [v]
  (let [t (transient [])]
    (persistent! (reduce conj! t v))))

谢谢你的回复。但我还是很困惑。在这种情况下,我看不出for的用法与clojure网站上的示例有什么大的区别:
(defn vrange2[n](loop[I 0 v(transient[])(if(
该recur表达式传递conj的值!回到循环中。对于表达式,不是这样的。好的,明白了。谢谢你,非常感谢。:)
(defn test-transient [v]
  (let [t (transient [])]
    (persistent! (reduce conj! t v))))