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

欢迎!请查看关于页面以了解更多此工作方式的详细信息。

+1
Collections

Util.pcequiv()方法

`
static public boolean pcequiv(Object k1, Object k2){

if(k1 instanceof IPersistentCollection)
	return ((IPersistentCollection)k1).equiv(k2);
return ((IPersistentCollection)k2).equiv(k1);

}
`

尝试获取等价语义(跨类数字相等性)以处理混合Clojure/Java集合比较的情况。然而,这不是一个可持续的方向,我们希望停止这样做。

附加的补丁移除了这个方法,并修改了调用代码,以仅在两个集合都是IPersistentCollection时调用equiv。

1 答案

+1
参考:https://clojure.atlassian.net/browse/CLJ-1375 (由 alexmiller 报告)
今天我实际上遇到了一个涉及核心缓存和raxod502/lazy-map的角落用例。懒映射实现定义了一个类型,实现了clojure.lang.IPersistentCollection和equiv方法(通过在当前对象强制实化为常规映射时调用.equiv)。

这可能需要在lazy-map中修复,但发生的原因是懒映射被用作缓存中某个键的值,并且当将整个映射与特殊值::expired(一个关键字)比较时,clojure.core.cache.wrapped/lookup-or-miss使用=函数。clojure.core/=分发给clojure.lang.Util/equiv,它调用clojure.lang.Util/pcequiv。结果,缓存在中的整个映射作为其中一个值的立即实现(Delays的当前值被计算)以获取其实际内容 - 即使它与一个关键字进行比较!

在惰性映射实现中,可以通过检查两个比较的对象是否实际上都是集合来实现解决方案,在 core.cache 中(通过使用 identical? 而不是 = 来检查循环中的值是否为特定的关键字)或者应用此补丁。
by
我不确定这对我有意义吗——比较的值之一是 Java 非Clojure 集合吗?
by
1. 使用 clojure.core/= 将 LazyMap 对象(实现 IPersistentCollection)与关键字进行比较

2. clojure.core/= 调用 clojure.lang.Util/equiv

3. clojure.lang.Util/equiv 调用 clojure.lang.Util/pcequiv

4. pcequiv 调用 LazyMap 的 IPersistentCollection 实现中的 equiv,导致所有延迟的值都变为实现(这应该是必需的,因为它需要完全比较两个映射),即使另一个对象是关键字(以相当约定式的做法用于传达某种特殊条件,在这种情况下是 :clojure.core.cache.wrapped/expired)。
by
在这里的问题票是关于比较 Java 集合和 Clojure 集合的,所以我认为你的情况并没有包含在内,而仅仅是纯实现机制。
...