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 无法将 clojure.lang.PersistentVector 强制转换为 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能够正确处理自定义比较器的案例。任意函数是黑盒,我们没有一种普遍有效的方法来打印它们(基于我的研究,我假设这是正确的)。我们总是可以为它们创建特殊的包装函数,但同样,这也不是通用的。

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