分享您的想法,请参与2024年Clojure状态调查!

欢迎!请参阅关于 页面获取更多关于此网站如何工作的信息。

0
打印

使用\~I\~_等失败,最简单的情况是

Clojure 1.6.0和1.5.1

user=> (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

user=> (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也会失败

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}
通常来说,调用这个函数是不必要的,因为 ppaven、
write 和 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 提供)
...