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 读取器将读取到 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 用户可以很容易地更改读取和打印设置来满足自己的需要。
...