From 531d0798cecd809103f5303d48e07cc85e28c93a Mon Sep 17 00:00:00 2001 From: Joel Martin Date: Wed, 10 Feb 2016 16:19:32 -0600 Subject: [PATCH] Simple pprint example. Answering #165. --- examples/pprint.mal | 41 +++++++++++++++++++++++++++++++++++++++++ 1 file changed, 41 insertions(+) create mode 100644 examples/pprint.mal diff --git a/examples/pprint.mal b/examples/pprint.mal new file mode 100644 index 00000000..39fb1586 --- /dev/null +++ b/examples/pprint.mal @@ -0,0 +1,41 @@ + +(def! spaces- (fn* [indent] + (if (> indent 0) + (str " " (spaces- (- indent 1))) + ""))) + +(def! pp-seq- (fn* [obj indent] + (let* [xindent (+ 1 indent)] + (apply str (pp- (first obj) 0) + (map (fn* [x] (str "\n" (spaces- xindent) + (pp- x xindent))) + (rest obj)))))) + +(def! pp-map- (fn* [obj indent] + (let* [ks (keys obj) + kindent (+ 1 indent) + kwidth (count (seq (str (first ks)))) + vindent (+ 1 (+ kwidth kindent))] + (apply str (pp- (first ks) 0) + " " + (pp- (get obj (first ks)) 0) + (map (fn* [k] (str "\n" (spaces- kindent) + (pp- k kindent) + " " + (pp- (get obj k) vindent))) + (rest (keys obj))))))) + +(def! pp- (fn* [obj indent] + (cond + (list? obj) (str "(" (pp-seq- obj indent) ")") + (vector? obj) (str "[" (pp-seq- obj indent) "]") + (map? obj) (str "{" (pp-map- obj indent) "}") + :else (pr-str obj)))) + +(def! pprint (fn* [obj] + (println (pp- obj 0)))) + + +(pprint '(7 8 9 "ten" [11 12 [13 14]] 15 16)) +(pprint '{:abc 123 :def {:ghi 456 :jkl [789 "ten eleven twelve"]}}) +(pprint '(7 8 {:abc 123 :def {:ghi 456 :jkl 789}} 9 10 [11 12 [13 14]] 15 16))