嗨!
我在让 cljs 美化打印 (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 - 所以它可能只是深度优先遍历图并不对每个节点的类型进行检查?到目前为止,这看起来像是一个错误,因为 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 以来没有变化,所以我假设所有版本都受到此影响。
谢谢帮助!