如何正确使用pprint-newline?

时间:2013-10-18 05:38:34

标签: clojure output pretty-print

我正在尝试打印一个序列,使得整个序列既不打印在一行上,也不打印序列中的每个元素。 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.

pprintwriter指定可选的第二个参数,默认情况下设置为*out*。但是,在这种情况下,我不确定如何向pprint-writer发送*out*,例如类似下面的示例似乎无法正常工作

(clojure.pprint/pprint [1 2 3 4] (*out* (clojure.pprint/pprint-newline :miser)))

2 个答案:

答案 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了解相关信息。