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

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

+1投票
ClojureScript
嗨,各位!
我遇到了一些麻烦,让 cljs 缩进打印(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中也存在)- pretty print应该在打印时不失真,让它看起来更美观(即更易读)。它不应该有自己的一套特性。每个其他的打印函数(包括spit)都是这样工作的,所以我无法想象为什么pprint不遵守clojure的标记字面量规范并按照自己的方式打印。

0投票

评论者:[email protected]

为CLJ-1890提供了一个新的补丁。如果它被Clojure接受,就可以将其移植到CLJS。

0投票
参考: https://clojure.atlassian.net/browse/CLJS-1753(由alexisport report)
...