请在2024年 Clojure 状态调查!中分享您的想法。

欢迎!请参阅关于页面以了解更多关于如何使用本网站的信息。

+1
ClojureScript
嗨!
我在让 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 以来没有变化,所以我假设所有版本都受到此影响。

谢谢帮助!

5 个答案

0

评论由:dnolen 制作

补丁必须提供测试用例。

0
by
_评论者:anmonteiro_

不确定这是否是一个错误。在 Clojure REPL 中运行这段代码会产生相同的结果


user=> (defrecord MyRecord [value])
user.MyRecord
user=> (require '[clojure.pprint :as pprint])
nil
user=> (pprint/pprint (MyRecord. "a"))
{:value "a"}
nil
0
by

评论者:miro

这是个好点子,确实很有趣……但我认为这的确是一个错误(似乎在 clj 中也存在)——漂亮的打印应该与打印的结果一样,只是更美观(也即更易于阅读)。它不应该有自己的特殊情况。其他所有打印函数(包括 spit)都这样做,所以我无法想象为什么 pprint 不遵守 Clojure 的标记字面量规范并以自己的方式打印。

0
by

评论者:[email protected]

针对 CLJ-1890 的新补丁。如果它被接受为 Clojure,则可以被移植到 CLJS。

0
by
参考:https://clojure.atlassian.net/browse/CLJS-1753 (由 alex+import 报告)
...