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

欢迎!请参阅关于页面以了解有关此内容的更多信息。

+1
ClojureScript
大家好!
我在使 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 以来没有改变,所以我认为所有版本直到当前版本都受到影响。

谢谢帮助!

5 答案

0

评论由:dnolen做出

补丁必须提供一个测试案例。

0
评论者: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

评论者:miro

您的捕捉很棒,这确实很有趣...但我仍然认为这肯定是一个错误(似乎在clj中也存在)——美化打印应该与打印一样工作,只是更美观(即更易读)。它不应该有自己的特性。每个其他打印函数(甚至包括spit)都以这种方式工作,所以我无法想象pprint不尊重Clojure的标记字面量规范并以其自己的方式打印的原因(或用例)。

0

评论者:[email protected]

有一个针对CLJ-1890的新补丁。如果它被接受作为Clojure的一部分,则可以将其移植到CLJS。

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