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

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

0
打印

在许多情况下使用 `~I` 和 `~_` 等会失败,最简单的一个例子是

Clojure 1.6.0 和 1.5.1

用户=> (clojure.pprint/cl-format true "~I") 类转换异常 java.io.PrintWriter 无法转换为 java.util.concurrent.Future clojure.core/deref-future (core.clj:2180) user=> (clojure.pprint/cl-format nil "~I") 类转换异常 java.io.StringWriter 无法转换为 java.util.concurrent.Future clojure.core/deref-future (core.clj:2180) user=> (clojure.pprint/cl-format nil "~_") 类转换异常 java.io.StringWriter 无法转换为 java.util.concurrent.Future clojure.core/deref-future (core.clj:2180)

Clojure 1.4.0

用户=> (clojure.pprint/cl-format true "~I") 类转换异常 java.io.OutputStreamWriter 无法转换为 clojure.lang.IDeref clojure.core/deref (core.clj:2080) user=> (clojure.pprint/cl-format nil "~I") 类转换异常 java.io.StringWriter 无法转换为 clojure.lang.IDeref clojure.core/deref (core.clj:2080) user=> (clojure.pprint/cl-format nil "~_") 类转换异常 java.io.StringWriter 无法转换为 clojure.lang.IDeref clojure.core/deref (core.clj:2080)

在其他实现中,例如 clisp,这些简单情况中会创建空输出

> (format t "~I") NIL > (format nil "~I") "" > (format nil "~_") ""

4 个答案

0

由 jafingerhut 发表的评论:

根据 CLHS 在这里: http://www.lispworks.com/documentation/lw51/CLHS/Body/22_cea.htm,波浪下划线序列用于“条件换行”

大写字母 I 用于缩进: http://www.lispworks.com/documentation/lw51/CLHS/Body/22_cec.htm

0

由 neapel 发表的评论:

哎呀,没想到要试这个。即使在 cl-format 之外也会失败

用户=> (clojure.pprint/pprint-newline :linear) 类转换异常 java.io.PrintWriter 无法转换到 java.util.concurrent.Future clojure.core/deref-future (core.clj:2180) 用户=> (clojure.pprint/pprint-indent :block 0) 类转换异常 java.io.PrintWriter 无法转换到 java.util.concurrent.Future clojure.core/deref-future (core.clj:2180)

手动创建格式化写入器仍然可以工作

用户=> (binding [*out* (clojure.pprint/get-pretty-writer *out*)] (clojure.pprint/pprint-newline :linear)) nil

在 get-pretty-writer 文档中说
引用
通常情况下,调用此函数是不必要的,因为 pprint、write 和 cl-format 在需要时都会调用它。
这似乎对 cl-format 不正确,并且如果能够自动应用于所有需要格式化写入器的函数,那就更好了。
引用

0

由 neapel 发表的评论:

更多坏消息!
手动创建 pretty-writer 也不起作用,因为它没有被正确刷新

用户=> (binding [*out* (get-pretty-writer *out*)] (cl-format true "hello ~_world~%")) hello world nil 用户=> (binding [*out* (get-pretty-writer *out*)] (cl-format true "hello ~_world")) hellonil 用户=> (binding [*out* (get-pretty-writer *out*)] (cl-format true "hello ~_world") (.ppflush *out*)) hello worldnil

~% 插入一个无条件的新行,就像 {{\n}} 一样,这也按预期工作。

在它前面插入 \~\_,它只打印到那里。但我还设法让它在其他 \~\_ 处终止,可能是因为其他命令刷新了它。

手动刷新它虽然很奇怪,但像私有宏 {{with-pretty-writer}} 一样有效。
我不明白为什么 {{get-pretty-writer}} 被公开了,但没有提供正确使用它的宏。此外,所有使用格式化写入器功能的函数都应使用 with-pretty-writer,这似乎是它专门为此设计的。这样,就没有必要公开它(或 get-pretty-writer)了。

0
参考:https://clojure.atlassian.net/browse/CLJ-1462 (由 alex+import 报告)
...