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报告)
我实际上今天遇到了关于core.cache和raxod502/lazy-map的问题。懒惰映射的实现定义了一个实现clojure.lang.IPersistentCollection类型的样式,并定义了它的equiv方法(通过在当前对象强制实现为普通映射时调用.equiv)。

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

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

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

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

4. pcequiv 调用 IPersistentCollection 实现中的equiv来对 LazyMap 进行比较,导致所有的延迟值都被实现(这应该是必要的,因为要完全比较两个映射),即使另一个对象是一个关键字(用作一种相当习惯性的方式来传达某些特殊条件,在本例中是 :clojure.core.cache.wrapped/expired)。
by
此处涉及的工单是关于比较 Java 集合和 Clojure 集合,因此我认为您的案例并不仅限于纯实现机制。
...