2024年的Clojure调查问卷!中分享你的想法。

欢迎!请查看关于页面以获取有关此功能的更多信息。

+1
Java Interop

目前,如果你在从(bean)生成的代理上运行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是一种修改操作,我们不支持类似的功能,如具有类似目的的records。

我对问题陈述本身没有反对意见——我认为这是一个合理的用例。但我认为修复应该发生在walk中,而不是在bean中。

0

评论由: sunng 发表

更新描述并添加复现信息

0

评论由: sunng 发表

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

0

评论由: alexmiller 发表

这些都是不可变集合,所以我在谈论的不是实际的修改,而是从一种不可变结构到另一种结构的变化。有几个现有的案例,我们有不支持empty的不可变集合,因为它们在概念上不合理,比如具有相同目的的记录实例和映射条目。

我想说的是,我认为这是一种情况,无论特定的接口和实现路径是否允许调用该方法。概念上,bean创建了一个只读视图的实例。将对象视图“清空”是没有意义的——对象总是有字段(这与具有固定字段的记录和具有键/值的映射条目是一样的论点)。我相信在ClojureScript中实际上有一个协议标记集合是否可以被清空,也许这也适用于这里。

0
参考: https://clojure.atlassian.net/browse/CLJ-2399(由 sunng 报告)
0
by

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

...