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

欢迎!请参阅 关于 页面,获取更多关于此功能的信息。

0
打印

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

Clojure 1.6.0 和 1.5.1

user=> (clojure.pprint/cl-format true "~I") ClassCastException java.io.PrintWriter cannot be cast to java.util.concurrent.Future clojure.core/deref-future (core.clj:2180) user=> (clojure.pprint/cl-format nil "~I") ClassCastException java.io.StringWriter cannot be cast to java.util.concurrent.Future clojure.core/deref-future (core.clj:2180) user=> (clojure.pprint/cl-format nil "~_") ClassCastException java.io.StringWriter cannot be cast to 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 cannot be cast to clojure.lang.IDeref clojure.core/deref (core.clj:2080) user=> (clojure.pprint/cl-format nil "~I") ClassCastException java.io.StringWriter cannot be cast to clojure.lang.IDeref clojure.core/deref (core.clj:2080) user=> (clojure.pprint/cl-format nil "~_") ClassCastException java.io.StringWriter cannot be cast to 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 也会失败

user=> (clojure.pprint/pprint-newline :linear) ClassCastException java.io.PrintWriter cannot be cast to java.util.concurrent.Future clojure.core/deref-future (core.clj:2180) user=> (clojure.pprint/pprint-indent :block 0) ClassCastException java.io.PrintWriter cannot be cast to 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,
write 和 cl-format 都会在需要时调用它。
{quote}
这似乎并不适用于 cl-format,而且如果能够自动应用于所有需要漂亮打印器的函数会更好。

0

评论由:neapel 发布

更多坏消息!
手动创建一个 pretty-writer 也不能解决问题,因为它没有被正确刷新

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

ilib>~%

在前面插入 \~\_ 后,它只会打印到那里。但我还成功地让它在学习其他 \~\_ 时中断,可能是因为其他命令触发了刷新。

像神秘私有的 {{with-pretty-writer}} 宏所做的那样手动刷新也能工作
我不明白为什么 {{get-pretty-writer}} 是公开的,但它需要的宏却没有公开。所有的使用漂亮打印器功能的函数都应该使用 with-pretty-writer,这似乎是它专门设计的。那么就没有必要公开它(或 get-pretty-writer)。

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