请在2024年Clojure状态调查!中分享您的想法。

欢迎!有关如何工作的更多信息,请参阅关于页面。

0
打印
当前pprint不打印defrecord类型的名称,而是只打印其底层的map。这与pr-str/println的行为形成对比。本条目提议更改pprint的行为,使其与pr-str和println的行为相匹配。

更多讨论请见https://groups.google.com/forum/#!topic/clojure-dev/lRDG6a5eE-s


user=> (defrecord myrec [a b])
user.myrec
user=> (->myrec 1 2)
#user.myrec{:a 1, :b 2}
user=> (pr-str (->myrec 1 2))
"#user.myrec{:a 1, :b 2}"
user=> (println (->myrec 1 2))
#user.myrec{:a 1, :b 2}
nil
user=> (pprint (->myrec 1 2))
{:a 1, :b 2}
nil


*方法:* 向pprint的简单分配模式添加新的IRecord情况。从pprint-map中提取pprint-map-kvs的内部结构,然后从现有的pprint-map和新的pprint-record调用它。为IRecord版本设置多方法优先级。添加了测试。


user=> (pprint (->myrec 1 2))
#user.myrec{:a 1, :b 2}

*补丁:* CLJ-1890-pprint-records-2.patch

*预审:** Alex Miller

*另请参阅:* CLJS-1753

10个答案

0

评论由:[email protected]发表

此修复需要移植到ClojureScript中。

0

评论由:[email protected]发表

添加了带类名的pprint记录补丁。

0

评论由:[email protected]发表

开放问题:当定义了打印方法的记录应该如何处理?是应该使用打印方法而不是pprint默认行为吗?

当前版本和我补丁在调用pprint时并未考虑打印方法。

0
评论者:alexmiller

我认为pprint不应该检查或使用打印方法。pprint有自己的简单分发多态方法,您可以扩展它,或者最终将回退到pr(可以通过print-dup扩展)。

前者的示例


user=> (defrecord R [a])
user=> (def r (->R 1))
user=> (pprint r)
{:a 1}

user=> (use 'clojure.pprint)
user=> (defmethod simple-dispatch user.R [r] (pr r))
#object[clojure.lang.MultiFn 0x497470ed "clojure.lang.MultiFn@497470ed"]
user=> (pprint r)
#user.R{:a 1}
0

评论由:[email protected]发表

是的,clojure.pprint/simple-dispatch就是为了用户代码定制pprint的使用,与打印方法无关。无需混淆两者。所以补丁已准备好供审阅。

0

评论者:michaelblume

补丁似乎不能干净地应用于当前的master。

0

评论者:michaelblume

看似不可干净地应用于任何beta标签,但在1.8.0中可以,但因为没有冲突所以无法重置。Steve,你可能需要修复这一点。

0

评论由:[email protected]发表

针对当前master(Clojure 1.9 beta4)修订的补丁

0

评论由:[email protected]发表

旧补丁已经过预筛,但我猜想新补丁应该在命名空间映射添加到Clojure之后从零开始重新考虑。顺便说一下,我认为没有针对打印命名空间映射的测试。我能找到的唯一测试是对命名空间映射的pr-str进行测试。无论如何,我试图确保前缀逻辑保持不变,因此它仍然应该可以工作。补丁的两个版本都使用相同的测试来打印记录。

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