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

欢迎!有关如何使用本站,请参阅关于页面以获取更多信息。

+1
Java 互操作

目前,如果在由(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是一个突变操作,我们不支持对具有类似目的的记录等操作进行empty。

我没有反对问题描述——我认为这确实是一个合理的用例。但是,我认为修复应该在walk中进行,而不是在bean中进行。

0

评论人:sunng

更新描述并添加复现步骤

0

评论人:sunng

感谢,Alex。我再次查看了clojure.core/empty的文档,它确实如此说明,它将委派给IPersistentCollection的.empty,以返回同一类型的空集合。PersistentArrayMap的实现仅返回一个缓存的空实例。它们都没有修改原始集合。因此,我认为在这里返回一个空映射是合理的。

0

评论人:alexmiller

这些都是不可变的集合,我所讨论的不是实际的修改,而是从一种不可变结构更改为另一种结构。存在几个现有的案例,我们有一些不可变的集合不支持empty,因为这在概念上没有意义,比如具有类似目的的记录实例和映射条目。

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

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

我认为给APersistentMap添加一个特殊案例,直接在walk中使用(into {} ...可以解决这个问题。

...