请分享您的想法,参加 2024 年 Clojure 状态调查!

欢迎!请参阅 关于 页面,了解更多有关该内容如何工作的信息。

0 投票
Clojure

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

后缀丢失是因为 {{str}} 直接调用 {{.toString}}:{{java.lang.BigDecimal}} 不了解 {{M}} 后缀。

在映射上调用 {{.toString}} 会调用 {{RT.print}} 并递归调用 {{RT.print}} 对键和值进行处理。{{RT.print}} 对 {{java.lang.BigDecimal}} 有一个特殊情况,因此会打印后缀。

6 个答案

0 投票
_评论由:alexmiller_

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

str 明确没有期待是可读的。
0 投票
_评论由: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-spit}} 的 {{pr-str}} 实例很简单,但如果没有办法将结果 {{slurp}} 回来,那么 {{spit}} 就没什么用了,对吧?

0 投票
by
_评论由:alexmiller_

哦,这个还是有点意思。作为一个解决方案,你可以在 spit 之前先 pr-str。

edn 打印的问题曾经多次被提出(甚至可能有一个关于它的票据)。
0 投票
by

评论者:alexmiller

CLJ-1201 就是一个这样的票据

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