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

欢迎!请参阅关于页面,了解更多关于如何使用本工作区的信息。

+1 投票
ClojureScript
嗨,各位!
我在使 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 以来没有改变,所以我假设所有版本都受影响。

感谢帮助!

5 答案

0 投票

评论者:dnolen

补丁必须提供测试用例。

0 投票
_评论由: anmonteiro_ 提供

不确定这是不是一个bug。在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 提供

这个捕捉很好,这确实很有趣...但我仍然认为这绝对是一个bug(这好像在clj中也有)——美化打印应该像打印一样工作,只是更美观一些(也就是更易读)。它不应该有自己的特性。每个其他打印函数(甚至包括spit)都是这样工作的,所以我无法想象pprint不遵循Clojure的标记字面量规范并以自己的方式打印的理由(或用例)。

0 投票

评论由: [email protected] 提供

有一个新的补丁针对CLJ-1890。如果它被添加到Clojure中,它可以移植到CLJS。

0 投票
参考:https://clojure.atlassian.net/browse/CLJS-1753(由 alex+import 提出)
...