请在2024 Clojure 状态调查!中分享您的看法。

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

+1投票
打印

据我所知,Clojure 的 pr 函数以打印对象,当重新读取时将等于原始对象。我的主要信息来源是 Clojure 内核开发者 Stuart Sierra 的这个讲话 https://youtu.be/pbodL96HM28?t=216(我没有找到任何文档来说明 pr 提供的保证)。

如果这是正确的,那么 pr 对 java.sql.Timestamp 和 java.util.Calendar 不起作用。例如,这返回 false。

(let [d (java.sql.Timestamp. 1)]
(= d
(read-string
  (pr-str d))))

此外,Clojure 的文档说,当 print-dup 为 true 时,这意味着 对象将以打印方式打印,以便在稍后读取时保留其类型

对于 java.sql.Timestamp 和 java.util.Calendar,情况并非如此

`
(binding [*print-dup* true]
(prn (java.sql.Timestamp. 1)))
=> #inst "1970-01-01T00:00:00.001000000-00:00"

除了回答以上问题,了解这些问题可能为 Clojure 支持由 https://clojure.atlassian.net/browse/CLJ-2224 跟踪的 java.time 日期类型提供一些基础。

我明白上述行为可以被用户更改,但我询问的是默认实现。

1 个回答

0

这是一般意图,但读取和打印系统都是开放的,并且主要基于 Java 类型(打印)或标签(读取)来扩展。

选择是在为几个JDK类型创建用于以#inst打印的#inst标记字面量时做出的。当时我不在现场,所以我真的不知道我是否能解释其中的原因。

#inst的默认读取器将读取到java.util.Date,但https://clojure.github.io/clojure/clojure.instant-api.html提供了读取到Calendar或java.sql.Timestamp的读取器函数。如果需要,这些可以在全局或逐次读取的基础上绑定(原始变更日志在https://github.com/clojure/clojure/blob/master/changes.md#211-instant-literals上有示例)。

感谢Alex。我想它现在可能仍然是个谜。正如你所说,最重要的事情是Clojure用户可以很容易地更改读取和打印设置以满足他们的需求。
...