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

欢迎!请参阅关于页面以获取更多信息。

+1
Java 互操作

目前,如果您在由(clojure.walk/prewalk identity (bean (java.util.Date.)))生成的代理上运行clojure.walk函数,它将抛出异常

(clojure.walk/prewalk identity (bean (java.util.Date.)))

 (link: java) ERROR in (test-walk-bean) (:-1)
 (link: java) expected: (clojure.walk/prewalk identity b)
 (link: java)   actual: java.lang.UnsupportedOperationException: empty
 (link: java)  at clojure.core.proxy$clojure.lang.APersistentMap$ff19274a.empty (:-1)
 (link: java)     clojure.core$empty.invokeStatic (core.clj:5202)
 (link: java)     clojure.walk$walk.invokeStatic (walk.clj:49)
 (link: java)     clojure.walk$prewalk.invokeStatic (walk.clj:64)
 (link: java)     clojure.walk$prewalk.invoke (walk.clj:60)
 (link: java)     clojure.lang.AFn.applyToHelper (AFn.java:156)
 (link: java)     clojure.lang.AFn.applyTo (AFn.java:144)
 (link: java)     clojure.core$apply.invokeStatic (core.clj:657)

因为代理没有实现empty,这是clojure.walk所需的。此补丁添加了一个用于重现和修复问题的测试。

9 答案

0

评论者:alexmiller

能否在描述中添加可复现的案例?

如果您尚未签署贡献者协议,请签署,否则我们无法考虑此补丁。https://clojure.org/community/contributing

谢谢!

0

评论者:sunng

看起来描述不可编辑。

我在补丁中包含了一个用于重现此问题的测试案例

(clojure.walk/postwalk identity (bean (java.util.Date.)))

我已经作为(Ning Sun, [email protected], github:sunng87)签署了协议

0

评论者:alexmiller

谢谢,我已赋予你编辑权限

0

评论者:alexmiller

仔细观察这个问题,我认为您提出的解决方案不合适。bean提供了一个(只读)Java对象的映射视图。empty是一个会改变状态的运算符,我不支持对具有类似目的的记录等使用它。

我并不是在反对问题陈述——我认为这是一个合理的用例。但是我认为修复应该放在walk而不是bean中。

0

评论者:sunng

更新描述并添加复现信息

0

评论者:sunng

谢谢你,Alex。我再次检查了clojure.core/empty的文档,它确实如此,它委托给IPersistentCollection的.empty,是为了返回同一类别的空集合。PersistentArrayMap的实现只是返回一个缓存的空实例。它们都没有改变原始集合。所以我认为在这里返回一个空映射是合理的。

0

评论者:alexmiller

这些都是不可变集合,所以我说的不是实际的修改,而是从一个不可变结构到一个不可变结构的转换。有几个现有的案例,我们有不支持empty的不可变集合,因为它们在概念上不合理,比如record实例和map条目。

我想说的是,我相信这是一个那样的案例,不管特定的接口和实现路径是否允许调用该方法。从概念上讲,bean创建了一个实例,它是Java对象的只读视图。对对象视图进行“清空”没有必要——对象总是有字段(这是与具有固定字段的record和一个键值对的map条目相同的论证)。我相信在ClojureScript中实际上有一个协议标记是否可以清空集合,也许这也适用于这里。

0
0
by

我认为为APersistentMap添加一个特殊案例,在walk中被直接使用(into {} ...,将修复此问题。

...