2024年Clojure状况调查!中分享您的看法。

欢迎!请参阅关于页面以了解更多关于此的工作信息。

+3
core.cache

我在使用core.cache结合LazyMap。Lazy maps类似映射对象(封装映射和添加一些逻辑以自动强制延迟值的新数据类型)。

当我开始将lazy maps作为FIFO Cache的值时,我观察到所有值都在映射进入缓存后立即实现。经过一些深入了解,我发现这是由于clojure.core.cache.wrapped/lookup-or-miss中的表达式(= ::expired v)引起的。

实际上,内部=调用clojure.lang.Util/equiv(由于LazyMap实现了IPersistentCollection),然后在一些分派之后,调用equals来检查lazy map的内容是否等于其他对象(隐含其他映射)。这是预期的行为,lazy map实现所有值以进行比较。

然而,当将映射类似对象与既不是映射也不是集合的东西比较时,我们希望在得知它肯定会返回false时立即截断。但这可能更多地与Clojure本身以及诸如CLJ-1375这样的东西有关。

如果这不太成问题,core.cache方面可以做什么?将

(= ::expired v)替换为(identical? ::expired v)

clojure.core.cache.wrapped中。

这不仅会修复像我的这样的角落案例,还会让事情稍微快一点(当涉及到Clojure关键词时,显式的引用相等很酷)。

可以更改的其他表达式
来自clojure.core.cache(= ::nope ret)(= ::nil v)

2 个答案

+1
by

我不明白为什么将所有的关键字比较改为identical?检查会成为问题。我将继续思考这个问题,同时我已经创建了https://clojure.atlassian.net/browse/CCACHE-66

您有我可以查看的重复示例吗?

by
谢谢!

以下是一些示例


(require '[clojure.core.cache :as cache]
                  '[clojure.core.cache.wrapped :as cwr]
                  '[lazy-map.core :as lm])

(def C (atom (cache/fifo-cache-factory {})))
(def m (lm/->LazyMap {:a 1 :b (delay 8)}))

m
; => {:a 1, :b <unrealized>}

 (cwr/lookup-or-miss C :k (constantly m))
; => {:a 1, :b 8}

m
; => {:a 1, :b 8}


需要

com.intuitiveexplanations/lazy-map   {:mvn/version "1.0.0"}
org.clojure/core.cache                           {:mvn/version "1.0.225"}
+1
by

附加CCACHE-66补丁

https://gist.github.com/siefca/fa2745999281440867de1d1a89243f6d

(我大约两三年前签署了Clojure贡献者协议。)

...