我正在尝试打印一个序列,使得整个序列既不打印在一行上,也不打印序列中的每个元素。 E.g。
[10 11 12 13 14 15 16 17 18 19
20 21 22 23 24 25 26 27 28 29]
我在文档中发现pprint-newline
表示允许我确定如何打印换行符。不幸的是,我找不到任何关于如何与pprint
一起使用的示例,并且文档字符串不提供太多见解:
-------------------------
clojure.pprint/pprint-newline
([kind])
Print a conditional newline to a pretty printing stream. kind specifies if the
newline is :linear, :miser, :fill, or :mandatory.
This function is intended for use when writing custom dispatch functions.
Output is sent to *out* which must be a pretty printing writer.
pprint
为writer
指定可选的第二个参数,默认情况下设置为*out*
。但是,在这种情况下,我不确定如何向pprint-writer
发送*out*
,例如类似下面的示例似乎无法正常工作
(clojure.pprint/pprint [1 2 3 4] (*out* (clojure.pprint/pprint-newline :miser)))
答案 0 :(得分:2)
虽然Guillermo解释了如何更改普通打印的发送方式,但如果你想做的只是以不同的方式打印一个系列,那也是可能的。
例如,使用cl-format
(在(use '[clojure.pprint :as pp)
之后):
(binding [pp/*print-pretty* true
pp/*print-miser-width* nil
pp/*print-right-margin* 10]
(pp/cl-format true "~<[~;~@{~a~^ ~:_~}~;]~:>~%" '[foo bar baz quux]))
根据需要设置*print-right-margin*
。
您不必使用格式。如果需要,格式指令可以转换为各自的漂亮打印机功能。格式字符串的说明:~<
和~:>
建立逻辑块。在块内,有三个部分由~;
分隔。第一部分和最后一部分是您的前缀和后缀,而元素使用~@{
和~}
打印在中间部分。对于每个元素,元素使用~a
打印,后跟空格(如果需要)和条件填充样式换行符。
(在CL中,格式字符串可以简化为"~<[~;~@{~a~^ ~}~;]~:@>~%"
,但这在Clojure 1.5中似乎不起作用。)
答案 1 :(得分:1)
正如帮助所说,该功能旨在用于自定义调度功能。
为了更改序列的pprint行为,您需要为clojure.lang.ISeq
提供新的调度函数。
您可以在clojure/pprint/dispatch.clj
(use-method simple-dispatch clojure.lang.ISeq pprint-list)
...
(defn- pprint-simple-list [alis]
(pprint-logical-block :prefix "(" :suffix ")"
(print-length-loop [alis (seq alis)]
(when alis
(write-out (first alis))
(when (next alis)
(.write ^java.io.Writer *out* " ")
(pprint-newline :linear)
(recur (next alis)))))))
由于根据数据类型调度打印,因此覆盖似乎是最佳选择。
请参阅source code了解相关信息。