【问题标题】:Clojure: Conversion from ArrayMap to HashMapClojure:从 ArrayMap 到 HashMap 的转换
【发布时间】:2018-11-01 11:40:26
【问题描述】:

我正在研究 clojure 源代码。 PersistentArrayMap 的实现在assoc 函数中有这个条件:

    if(array.length >= HASHTABLE_THRESHOLD)
        return createHT(array).assoc(key, val);

HASHTABLE_THRESHOLD 是 16。因此,如果 arraymap 已经有 8 对,则 assoc 应该返回一个 PersistentHashMap。现在看看这个 clojure 代码:

(defn create [n, init] (if (= n 0) init (recur (dec n) (assoc init n n))))
(type (create 9 {}))

输出是clojure.lang.PersistentArrayMap,不应该是PersistentHashMap吗?如果我使用 10 而不是 9,我会得到什么。

【问题讨论】:

    标签: java data-structures clojure hashmap


    【解决方案1】:

    这是在 Clojure 1.10 中修复的 assoc 的错误:https://dev.clojure.org/jira/browse/CLJ-1587 in this commit(别介意提交已经 4 年了)。

    该错误仅影响assoc,因此其他一些生成 9 键地图的方式不受影响:

    Clojure 1.9.0
    (type {9 9, 8 8, 7 7, 6 6, 5 5, 4 4, 3 3, 2 2, 1 1})
    => clojure.lang.PersistentHashMap
    (type (into {} (map vector (range 9) (range 9))))
    => clojure.lang.PersistentHashMap
    

    修复后:

    Clojure 1.10.0-beta4
    (type (create 9 {}))
    => clojure.lang.PersistentHashMap
    

    【讨论】:

    • 看到一个四年前的提交被包含在最近的 clojure 版本中是很奇怪的。背后的原因可能是什么?
    • Clojure 的补丁过程并不是您可以在任何可预测的时间内可靠地获得贡献的过程。作为局外人,我们无法对原因做出可靠的猜测,只是观察到确实有许多补丁在被接受或拒绝之前会徘徊很长时间。
    猜你喜欢
    • 2013-10-26
    • 1970-01-01
    • 1970-01-01
    • 2022-12-05
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2023-03-17
    • 1970-01-01
    相关资源
    最近更新 更多