2024年Clojure状况调查!分享您的想法。

欢迎!请查阅关于页面以获取更多关于它的工作方式的信息。

0
Clojure

{{print-dup}}对排序集合和映射假设了不存在的静态{{create}}方法,该方法接收一个{{IPersistentCollection}}

打印

`
user=> (print-dup (sorted-set 1) out)

=(clojure.lang.PersistentTreeSet/create [1])

`

无法读取

(read-string "#=(clojure.lang.PersistentTreeSet/create [1])") ClassCastException Cannot cast clojure.lang.PersistentVector to clojure.lang.ISeq java.lang.Class.cast (Class.java:3356)

可能的修复方法
为集合添加接收{{IPersistentVector}}的{{create}}方法
发出与{{print-dup}}不同的事物

4 答案

0

评论由:alexmiller

它试图使用(link: "123")调用PersistentTreeSet.create(ISeq)。不清楚向量是从哪里来的?

0
_评论由:tonsky_

它是CLJ-1461的特例。向量来自读取print-dup的输出

(defrecord Rec [f])

(binding [*print-dup* true]
  (prn (Rec. (sorted-set 1))))
;; => #tonsky.Rec[#=(clojure.lang.PersistentTreeSet/create [1])]

我已经为PersistentTreeSet打了一个补丁(附在本处)。稍后可以查看CLJ-1461。
0

评论由:mikerod

对于使用自定义比较器(如sorted-set-by等)定义的排序集合(或映射),这是无法工作的。我认为,来回打印以读取结果将令人困惑并且不正确,对吧?

对我来说,这里还有一个更麻烦的问题是,我看不到让print-dup能够正确处理自定义比较器的明确方法。任意的函数是黑盒子,我们没有普遍、有效的方法来打印-dup它们(根据我的研究,我假设这是正确的)。我们总是可以为此创建特殊的包装函数,但这仍然不是普遍适用的。

0
参考:[CLJ-1733](https://clojure.atlassian.net/browse/CLJ-1733)(由tonsky汇报)
...