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

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

0
Clojure

{{(str 1M)}} 产生 {{"1"}}
{{(str {:a 1M})}} 产生 {{"{:a 1M}"}}

后缀丢失是因为 {{str}} 直接调用了 {{.toString}}:{{java.lang.BigDecimal}} 对 {{S}} 后缀一无所知。

在 map 上调用 {{code>.toString}} 会调用 {{RT.print}},并可递归调用 {{RT.print}} 来打印键和值。{{RT.print}} 对 {{java.lang.BigDecimal}} 有一个特例,因此它会打印后缀。

6 个回答

0
_Comment made by: alexmiller_

如果您想打印一个可以稍后读的字符串,通常您会使用 pr-str。为什么这里的 pr-str 不是一个好选择?

str 故意没有可读性的期望。
0
_Comment made by: dpsutton_

最初是在研究 `spit` 时发现这个问题。这个特定的行为最终证明并不是问题的根源,但在研究过程中发现了这个问题。


clojure -e '(spit "foo.edn" 3M)' &&&; cat foo.edn
3

clojure -e '(spit "foo.edn" {:thing 3M})' && cat foo.edn
{:thing 3M}


我们想知道使用 spit 进行 edn 是不是一种失误,或者这是一个真正的错误。
0

由dottedmag发布的评论:

{{spit}} 调用了{{str}},这就是我偶然发现这个问题的原因。

做一个调用{{pr-str}}的{{pr-spit}}很简单,但如果它的结果无法被{{slurp}},那么{{spit}}不是有点没用吗?

0
_Comment made by: alexmiller_

哦,这相当有趣。作为 workaround,你可以在 spit 之前先执行 pr-str。

关于 edn 打印的问题已经多次出现(可能甚至有一个关于它的 ticket)。
0

由 alexmiller 发布的评论:

CLJ-1201 就是这样的一个 ticket。

0
参考:[https://clojure.atlassian.net/browse/CLJ-2485](https://clojure.atlassian.net/browse/CLJ-2485)(由dottedmag报告)
...