我在与LazyMap
结合使用core.cache
。懒惰映射类似于映射类型的对象(封装映射并添加一些逻辑以自动强制延迟与键关联的值的新数据类型)。
当我开始将懒惰映射作为 FIFO 缓存的值时,我注意到所有值都是在映射进入缓存后立即被实现的。经过一些调查,我发现这是由 clojure.core.cache.wrapped/lookup-or-miss
中的表达式 (= ::expired v)
引起的。
内部,=
会调用clojure.lang.Util/equiv
(因为LazyMap
实现了IPersistentCollection
),然后经过一些分配后,equiv
被调用以检查懒惰映射的内容是否与其他对象(隐含为其他映射)相等。这是期望的行为,懒惰映射实现所有值以使比较成为可能。
然而,当比较类似映射的对象与不是映射(也不是集合)的东西时,如果在确认确实会返回false
的情况下进行短路,那么将受欢迎。但改变这一点可能更多地与 Clojure 本身以及像CLJ-1375一样的事情有关。
如果这样做不会太麻烦,那么在 clojure.core.cache.wrapped
中可以替换的将是
(= ::expired v)
与 (identical? ::expired v)
。
这不仅将解决像我的这样的边缘情况,还能稍微加快速度(在 Clojure 关键字方面,显式的引用相等棒极了)。
还可能在其他地方进行这种更改的表达式(以防万一)是
(= ::nope ret)
和 (= ::nil v)
,来自 clojure.core.cache
。