我在使用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)
。