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

欢迎!请查看关于页面,了解更多此工作方式的信息。

0
打印

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

Clojure 1.6.0和1.5.1

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

Clojure 1.4.0

user=> (clojure.pprint/cl-format true "~I") ClassCastException java.io.OutputStreamWriter无法转换为clojure.lang.IDeref clojure.core/deref (core.clj:2080) user=> (clojure.pprint/cl-format nil "~I") ClassCastException java.io.StringWriter无法转换为clojure.lang.IDeref clojure.core/deref (core.clj:2080) user=> (clojure.pprint/cl-format nil "~_") ClassCastException 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用于缩进:《a rel="nofollow" href="http://www.lispworks.com/documentation/lw51/CLHS/Body/22_cec.htm" target="_blank">http://www.lispworks.com/documentation/lw51/CLHS/Body/22_cec.htm

0

由:neapel

啊,没想到试着这么做。如果没有cl-format,它也会失败

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

手动创建一个格式化写出程序确实可以工作

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

在 get-pretty-writer 文档中说
{quote}
通常,调用此函数是不必要的,因为 pprint、
写和 cl-format 都会在需要时调用它。
{quote}
对于 cl-format 来说,这似乎并不成立,如果它能自动应用于所有需要格式化写出程序的功能将会很棒。

0

由:neapel

更坏的消息!
手动创建格式化写出程序也无法解决问题,因为它没有被正确刷新

user=> (binding [*out* (get-pretty-writer *out*)] (cl-format true "hello ~_world~%")) hello world nil user=> (binding [*out* (get-pretty-writer *out*)] (cl-format true "hello ~_world")) hellonil user=> (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 报告)
...