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

欢迎!请参阅关于页面获取更多有关此工作方式的信息。

+1投票
ClojureScript
你好!
我无法使cljs美化打印(cljs.pprint/pprint)在遇到默认用于表示自定义记录的带标签元素时表现得与常规 cljs 或 clj 打印函数相同。

见下例 - *pr、pr-str、print* 和 *print-str* 函数都使用针对 MyRecord 的默认方法创建(类似edn)的带标签元素,并产生相同的结果
*#cljs.user.MyRecord{:value "a"}*

另一方面 *pprint* 忽略记录的标签,仅仅将它作为一种映射来遍历/打印
*{:value "a"}*

我遗漏了cljs.pprint命名空间中的某种设置和/或参数吗?我简要地查看了一下代码,但似乎它默认使用print-str - 因此它可能只是深度遍历图并将其深度检查到每个节点类型?在我这个阶段,这看起来像是一个bug,因为pprint函数的预期行为应该是与print和其他核心函数的行为相同。

这工作

cljs.user=> (defrecord MyRecord [value])
cljs.user/MyRecord
cljs.user=> (pr (MyRecord. "a"))
#cljs.user.MyRecord{:value "a"}
nil
cljs.user=> (pr-str (MyRecord. "a"))
"#cljs.user.MyRecord{:value \"a\"}"
cljs.user=> (print (MyRecord. "a"))
#cljs.user.MyRecord{:value a}
nil
cljs.user=> (print-str (MyRecord. "a"))
"#cljs.user.MyRecord{:value a}"


但是这不行

cljs.user=> (cljs.pprint/pprint (MyRecord. "a"))
{:value "a"}
("{:value \"a\"}\n")
cljs.user=> (with-out-str (cljs.pprint/pprint (MyRecord. "a")))
"{:value \"a\"}\n"


根据GitHub,cljs.pprint命名空间的头版本自1.7.28以来没有变化,所以我假设所有版本都受到影响。

谢谢帮助!

5 个答案

0投票

评论由:dnolen制作

补丁必须提供测试用例。

0投票
by
_评论由:anmonteiro_发布

不确定这是否是一个错误。在 Clojure REPL 中运行此操作会产生相同的结果


user=> (defrecord MyRecord [value])
user.MyRecord
user=> (require '[clojure.pprint :as pprint])
nil
user=> (pprint/pprint (MyRecord. "a"))
{:value "a"}
nil
0投票
by

评论由:miro发布

这是个很好的发现,这确实很有趣...但我认为这绝对是一个错误(似乎在clj中也有这个问题)——美化的打印应该像打印一样工作,只是更漂亮(即更易读) :)(也称为更易于阅读)。它不应该有自己的特性。其他所有打印函数(甚至包括spit)都是这样工作的,因此我很难想象为什么pprint不遵守 clojure 的标记字面量规范并按其自己的方式打印。

0投票
by

评论由:steveminergmail.com发布

有一个新补丁用于CLJ-1890。如果它被接受到Clojure中,它可以移植到CLJS。

0投票
by
参考:https://clojure.atlassian.net/browse/CLJS-1753(由 alex+import 提交)
...