From dc4e533a38bea5c76a96d01ccd1aca85df1a96c4 Mon Sep 17 00:00:00 2001 From: Stuart Halloway Date: Sat, 18 Dec 2010 16:11:40 -0500 Subject: [PATCH] partial fix for #695. does not fix sets --- src/clj/clojure/pprint/dispatch.clj | 29 +++++++++++++++++------------ src/clj/clojure/pprint/pprint_base.clj | 27 ++++++++++++++++----------- 2 files changed, 33 insertions(+), 23 deletions(-) diff --git a/src/clj/clojure/pprint/dispatch.clj b/src/clj/clojure/pprint/dispatch.clj index a6ae293..70ccef2 100644 --- a/src/clj/clojure/pprint/dispatch.clj +++ b/src/clj/clojure/pprint/dispatch.clj @@ -68,10 +68,11 @@ (loop [alis (seq alis)] (when alis (write-out (first alis)) - (when (next alis) - (.write ^java.io.Writer *out* " ") - (pprint-newline :linear) - (recur (next alis))))))) + (when-not (length-passed?) + (when (next alis) + (.write ^java.io.Writer *out* " ") + (pprint-newline :linear) + (recur (next alis)))))))) (defn- pprint-list [alis] (if-not (pprint-reader-macro alis) @@ -83,10 +84,11 @@ (loop [aseq (seq avec)] (when aseq (write-out (first aseq)) - (when (next aseq) - (.write ^java.io.Writer *out* " ") - (pprint-newline :linear) - (recur (next aseq))))))) + (when-not (length-passed?) + (when (next aseq) + (.write ^java.io.Writer *out* " ") + (pprint-newline :linear) + (recur (next aseq)))))))) (def ^{:private true} pprint-array (formatter-out "~<[~;~@{~w~^, ~:_~}~;]~:>")) @@ -100,10 +102,13 @@ (.write ^java.io.Writer *out* " ") (pprint-newline :linear) (write-out (fnext (first aseq)))) - (when (next aseq) - (.write ^java.io.Writer *out* ", ") - (pprint-newline :linear) - (recur (next aseq))))))) + (if *current-length* (set! *current-length* (inc *current-length*))) + (if (length-reached?) + (print ", ...") + (when (next aseq) + (.write ^java.io.Writer *out* ", ") + (pprint-newline :linear) + (recur (next aseq)))))))) (def ^{:private true} pprint-set (formatter-out "~<#{~;~@{~w~^ ~:_~}~;}~:>")) diff --git a/src/clj/clojure/pprint/pprint_base.clj b/src/clj/clojure/pprint/pprint_base.clj index 9c82fa6..cbd4c00 100644 --- a/src/clj/clojure/pprint/pprint_base.clj +++ b/src/clj/clojure/pprint/pprint_base.clj @@ -167,6 +167,14 @@ radix specifier is in the form #XXr where XX is the decimal value of *print-base (.flush *out*)))) +(defmacro length-reached? + [] + `(and *current-length* *print-length* (>= *current-length* *print-length*))) + +(defmacro length-passed? + [] + `(and *current-length* *print-length* (> *current-length* *print-length*))) + ;;;TODO: if pretty print is not set, don't use pr but rather something that respects *print-base*, etc. (defn write-out "Write an object to *out* subject to the current bindings of the printer control @@ -181,18 +189,15 @@ already know that the pretty printer will have set up their environment appropri Normal library clients should use the standard \"write\" interface. " {:added "1.2"} [object] - (let [length-reached (and - *current-length* - *print-length* - (>= *current-length* *print-length*))] - (if-not *print-pretty* - (pr object) - (if length-reached + (if-not *print-pretty* + (pr object) + (do + (if (length-reached?) (print "...") - (do - (if *current-length* (set! *current-length* (inc *current-length*))) - (*print-pprint-dispatch* object)))) - length-reached)) + (when-not (length-passed?) + (*print-pprint-dispatch* object))) + (if *current-length* (set! *current-length* (inc *current-length*))))) + (length-reached?)) (defn write "Write an object subject to the current bindings of the printer control variables. -- 1.7.1