分享您的想法,参加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支持的java.time日期类型(由https://clojure.atlassian.net/browse/CLJ-2224跟踪)提供一些基础。

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

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 用户可以轻松更改读取和打印设置以满足他们的需求。
...