大家好!
我在使 cljs 的 prettiful 打印 (cljs.pprint/pprint) 在打印默认用于表示自定义记录的标记元素时表现得与常规 cljs 或 clj 打印函数相同方面遇到了麻烦。
下面是示例 - *pr, pr-str, print* 和 *print-str* 函数都使用对创建 (edn-like) 标记元素的默认方法对待 MyRecord,并且都产生相同的结果
*#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 以来没有改变,所以我认为所有版本直到当前版本都受到影响。
谢谢帮助!