嗨,各位!
我在使 cljs 指定打印(cljs.pprint/pprint)与常规 cljs 或 clj 打印功能在打印默认用于表示自定义记录的标记元素时表现得相同方面遇到了麻烦。
请看下面的示例 - *pr, pr-str, print* 和 *print-str* 函数都使用默认方法创建(EDN 类似)标记元素为 MyRecord,并且产生相同的结果
*#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 以来没有改变,所以我假设所有版本都受影响。
感谢帮助!