欢迎!请查看关于页面以获得更多关于此功能的信息。
来自https://clojure.org/reference/transducers#_creating_transducible_processes的引用
转换过程必须封装调用转换器返回的函数的引用这些可能是状态化的且不安全的对于跨线程使用来说。
loop
recur
clojure.core/drop
请登录或注册以回答此问题。
(definterface IMutable (get []) (set [new-val])) (deftype UnsynchronizedMutable [^:unsynchronized-mutable n] IMutable (get [_] n) (set [_, nv] (set! n nv))) (defn drop! ([n] (fn [rf] (let [nv (UnsynchronizedMutable. n)] (fn ([] (rf)) ([result] (rf result)) ([result input] (let [^long n (.get nv)] (.set nv (dec n)) (if (pos? n) result (rf result input))))))))) (comment (criterium.core/quick-bench (transduce (comp (map inc) (drop 1)) + (range 1000))) #_"Execution time mean : 39,455570 µs" (criterium.core/quick-bench (transduce (comp (map inc) (drop! 1)) + (range 1000))) #_"Execution time mean : 24,979885 µs")
答案可以在以下讨论中找到 https://groups.google.com/d/msg/clojure/VQj0E9TJWYY/nXVf_H6sAgAJ
因此,当我们确信处于单线程减少上下文时,我们可以使用不安全的转换器。但并不适用于所有情况。
如果你愿意参与这场战斗,你可能会对这个线程感兴趣 https://clojure.atlassian.net/browse/CLJ-2146