你好!
我无法使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以来没有变化,所以我假设所有版本都受到影响。
谢谢帮助!