clojure - 如何使用 pprint 格式化多行 map ?

标签 clojure pprint

pprint 的文档有点像砖墙。如果您打印一张 map ,它会打印成一行,如下所示:{:a "b", :b "c", :d "e"}。相反,我希望像这样打印,可以选择使用逗号:

{:a "b"
 :b "c"
 :d "e"}

如何使用 pprint 做到这一点?

最佳答案

您可以设置*print-right-margin*绑定(bind):

Clojure=> (binding [*print-right-margin* 7] (pprint {:a 1 :b 2 :c 3}))
{:a 1,
 :b 2,
 :c 3}

不完全是您正在寻找的内容,但可能就足够了?

顺便说一句,解决这个问题的最好方法 - 或者至少是我采取的方法 - 是使用

Clojure=> (use 'clojure.contrib.repl-utils)
Clojure=> (source pprint)
(defn pprint 
  "Pretty print object to the optional output writer. If the writer is not provided, 
print the object to the currently bound value of *out*."
  ([object] (pprint object *out*)) 
  ([object writer]
     (with-pretty-writer writer
       (binding [*print-pretty* true]
         (write-out object))
       (if (not (= 0 (.getColumn #^PrettyWriter *out*)))
         (.write *out* (int \newline))))))
nil

嗯嗯嗯.. with-pretty-writer*out* 做了什么?

Clojure=> (source clojure.contrib.pprint/with-pretty-writer)
(defmacro #^{:private true} with-pretty-writer [base-writer & body]
  `(let [new-writer# (not (pretty-writer? ~base-writer))]
     (binding [*out* (if new-writer#
                      (make-pretty-writer ~base-writer *print-right-margin* *print-miser-width*)
                      ~base-writer)]
       ~@body
       (if new-writer# (.flush *out*)))))
nil

好吧,所以*print-right-margin*听起来很有希望...

Clojure=> (source clojure.contrib.pprint/make-pretty-writer)
(defn- make-pretty-writer 
  "Wrap base-writer in a PrettyWriter with the specified right-margin and miser-width"
  [base-writer right-margin miser-width]
  (PrettyWriter. base-writer right-margin miser-width))
nil

此外,这也提供了很多信息:

Clojure=> (doc *print-right-margin*)
-------------------------
clojure.contrib.pprint/*print-right-margin*
nil
  Pretty printing will try to avoid anything going beyond this column.
Set it to nil to have pprint let the line be arbitrarily long. This will ignore all 
non-mandatory newlines.
nil

无论如何 - 也许您甚至已经知道这一点 - 如果您确实想自定义 pprint 的工作方式,您可以 proxy clojure.contrib.pprint .PrettyWriter 并将其绑定(bind)到 *out* 来传递。 PrettyWriter 类非常大并且令人生畏,所以我不确定这是否是您最初所说的“砖墙”评论的意思。

关于clojure - 如何使用 pprint 格式化多行 map ?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/4020186/

相关文章:

object - Clojure并发: Let an agent act on a java object/deftype

clojure - 如何以惯用的clojure方式重复字符串n次?

python - Python 中的 Namedtuple 格式化/ pretty-print

clojure - 使用Clojure中的自定义方法漂亮地打印记录

python - pprint 字典在多行

python - 如何强制 pprint 每行打印一个列表/元组/字典元素?

clojure - 如何更新/覆盖具有基数很多的 ref 属性?

clojure - 运行服务器时注册多个处理程序

java - 从 Java 调用 Clojure : java. lang.NumberFormatException: null

python - 如何使用 Python 的 pprint 模块漂亮地打印出嵌套在列表中的字典键值对?