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)

可能的修复方法
添加 {{create}} 方法,该方法接受 {{IPersistentVector}} 到集合中,从 {{print-dup}} 中输出不同的内容

4 个答案

0投票

由:alexmiller

它在尝试调用 PersistentTreeSet.create(ISeq) 时使用 (link: "123")。对于向量从何而来,我并不清楚?

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

这无法适用于通过 fn,如 sorted-set-by 等定义的排序集合(或映射)并使用自定义比较器。我认为这样来回的打印到读取结果将会是困惑和错误的,对吗?

这里对我来说更加麻烦的是,我觉得没有一个明确的方法使 print-dup 能够正确处理自定义比较器的案例。任意函数是黑盒,我们没有一种通用的、有效的方法来打印它们(根据我的研究,我假设这是正确的)。我们总是可以为它创建专门的包装函数,但同样,这也不是通用的。

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