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

它尝试用("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
参考:[链接](https://clojure.atlassian.net/browse/CLJ-1733)(由tonsky报告)
...