2024 Clojure 状态调查!中分享您的想法。

欢迎!请查看关于页面以获取更多有关如何使用此信息的信息。

0投票
集合
已关闭

https://github.com/clojure/clojure/blob/010864f/src/clj/clojure/core.clj#L6553-L6562

因为 PHM 实现了 clojure.lang.IKVReduce 和 IPersistentMap,它们会通过支持 reduce-kv 的协议进行非确定性分派(clojure.core.protocols/IKVReduce)。

解决此问题的潜在方法是在 reduce-kv 中添加对 clojure.lang.IKVReduce 的实例检查(这类似于 reduce 如何检查 IReduceInit)。

另一方法是直接将协议扩展到 PersistentHashMap 和 PersistentArrayMap(除了保留现有扩展以外)。

在备注中已关闭: 已修复在 1.11.0-alpha2 中

3 答案

0投票

评论由:bronsa 提供

CLJ-1807 为此类问题提供了一个通用解决方案

0投票
_评论由:gshayban_ 提供

重放代码


(def C (atom 0))

;;重新扩展以进行仪器检查
(extend-protocol clojure.core.protocols/IKVReduce
 ;;慢路径默认
 clojure.lang.IPersistentMap
 (kv-reduce
   [amap f init]
   (swap! C inc)
   (reduce (fn [ret [k v]] (f ret k v)) init amap)))

(reduce-kv (fn [_ _ _]) nil (array-map 1 2 3 4))
(println "slowpaths" @C)
(reduce-kv (fn [_ _ _]) nil (hash-map 1 2 3 4))
(println "slowpaths" @C)




重复输出

➜  dev /usr/lib/jvm/java-8-openjdk/bin/java -cp $(clojure -Spath) clojure.main kvfastpath.clj
slowpaths 1
slowpaths 2
➜  dev /usr/lib/jvm/java-11-openjdk/bin/java -cp $(clojure -Spath) clojure.main kvfastpath.clj
slowpaths 0
slowpaths 0
0投票
by
参考: https://clojure.atlassian.net/browse/CLJ-1879 (由gshayban报告)
...