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

但是,对于使用自定义Comparator(如sorted-set-by等)定义的有序集(或映射),这不会有作用。我认为然后的往返打印到读取结果将是令人困惑且不正确的,对吗?

对我来说更麻烦的是,我看不出打印-dup如何能够正确地处理自定义Comparator的情况。任意函数是黑盒子,我们没有一般有效的打印-dup方法(根据我的研究,我假设这是正确的)。我们总是可以为它制作特殊的包装函数,但这同样不是通用的。

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