clojure pprint

clojure - ¿Cómo puedo formatear un mapa en varias líneas con pprint?



(2)

No creo que puedas hacer eso, probablemente tendrás que escribir el tuyo, algo como:

(defn pprint-map [m] (print "{") (doall (for [[k v] m] (println k v))) (print "}"))

pprint documentos de pprint son una especie de muro de ladrillos. Si imprime un mapa, sale en una línea así: {:a "b", :b "c", :d "e"} ,: {:a "b", :b "c", :d "e"} ,: {:a "b", :b "c", :d "e"} . En su lugar, me gustaría que me imprimieran así, opcionalmente con comas:

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

¿Cómo uno haría eso con pprint?


Puede establecer el enlace *print-right-margin* :

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

¿No es exactamente lo que estás buscando, pero podría ser suficiente?

Por cierto, la mejor manera de resolver esto, o al menos el enfoque que tomé, es usar

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

Hmmrmmm ... ¿qué hace with-pretty-writer para *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

Bien, así que *print-right-margin* suena prometedor ...

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

Además, esto es bastante informativo:

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

De todos modos, y tal vez ya sabías esto, si realmente quieres personalizar la forma en que funciona pprint , puedes hacer un proxy clojure.contrib.pprint.PrettyWriter y transmitirlo enlazándolo a *out* . La clase PrettyWriter es bastante grande e intimidante, así que no estoy seguro de si esto fue lo que quisiste decir con tu comentario de "muro de ladrillos".