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用于缩进: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)

手动创建一个美化写入器仍然有效

用户=> (绑定 [*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
by

由neapel发表的评论:

更坏的消息!
手动创建一个美化写入器也没有作用,因为它没有被适当地刷新

用户=> (绑定 [*out* (get-pretty-writer *out*)] (cl-format true "hello ~_world~%")) hello world nil 用户=> (绑定 [*out* (get-pretty-writer *out*)] (cl-format true "hello ~_world")) hellonil 用户=> (绑定 [*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
by
参考:https://clojure.atlassian.net/browse/CLJ-1462(由 alex+import 报告)
...