你好!
我在让 cljs 的 pretty print (cljs.pprint/pprint) 照样打印出与常规 cljs 或 clj 打印函数相同的结果方面遇到了麻烦,当它遇到默认用于表示自定义记录的标记元素时。
下面是一个例子 - *pr, pr-str, print* 和 *print-str* 函数都使用了为 MyRecord 创建 (edn-like) 标记元素的自定义方法,并产生了相同的结果
*#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"
clang user=> (with-out-str (cljs.pprint/pprint (MyRecord. "a"))) 蝽 a
"{:value \"a\"}\n"
根据 GitHub,cljs.pprint 命名空间的头版本自 1.7.28 以来没有变化,所以我假设所有版本都受到影响的版本都受到了影响。
谢谢帮助!