2

我正在尝试打印一个序列,使得整个序列都不会打印在一行上,序列的每个元素也不会打印在自己的行上。例如

[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)))
4

2 回答 2

3

虽然 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*随心所欲设置。

您不必为此使用格式。如果需要,可以将格式指令转换为它们各自的漂亮打印机功能。格式字符串解释:~<~:>建立逻辑块。在块内,有三个部分,由 . 分隔~;。第一个和最后一个部分是您的前缀和后缀,而元素打印在中间部分,使用~@{and ~}。对于每个元素,使用 打印该元素~a,如果需要,后跟一个空格,以及一个有条件的填充样式换行符。

(在 CL 中,格式字符串可以简化为"~<[~;~@{~a~^ ~}~;]~:@>~%",但这在 Clojure 1.5 中似乎不起作用。)

于 2013-10-18T16:38:19.403 回答
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)))))))    

由于根据数据类型覆盖发送打印似乎是要走的路。

有关想法,请参阅源代码

于 2013-10-18T15:42:33.653 回答