2024 Clojure现状调查!中分享你的想法。

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

+1
ClojureScript
你好!
我在让 cljs 的 pretty print (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 - 所以可能只是按深度优先顺序遍历图,并没有检查每个节点的类型?到目前为止,这似乎像我眼中的一个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"
clang user=> (with-out-str (cljs.pprint/pprint (MyRecord. "a"))) 蝽 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应该像print一样工作,只更漂亮(也就是更易读)。它不应该有其独特的特征。其他所有打印函数(包括spit)都是以这种方式工作的,所以我无法想象为什么要pprint不尊重Clojure的标记字面量规范并以其自己的方式打印。

0

评论人:[email protected]

有一个新的补丁用于CLJ-1890。如果它被Clojure接受,它就可以被移植到CLJS。

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