Commit | Line | Data |
---|---|---|
dcdb6c02 NB |
1 | ;; Pretty printer a MAL object. |
2 | ||
bf6647fb NB |
3 | (def! pprint |
4 | ||
5 | (let* [ | |
6 | ||
7 | spaces- (fn* [indent] | |
8 | (if (> indent 0) | |
9 | (str " " (spaces- (- indent 1))) | |
10 | "")) | |
11 | ||
12 | pp-seq- (fn* [obj indent] | |
13 | (let* [xindent (+ 1 indent)] | |
14 | (apply str (pp- (first obj) 0) | |
15 | (map (fn* [x] (str "\n" (spaces- xindent) | |
16 | (pp- x xindent))) | |
17 | (rest obj))))) | |
18 | ||
19 | pp-map- (fn* [obj indent] | |
20 | (let* [ks (keys obj) | |
21 | kindent (+ 1 indent) | |
22 | kwidth (count (seq (str (first ks)))) | |
23 | vindent (+ 1 (+ kwidth kindent))] | |
24 | (apply str (pp- (first ks) 0) | |
25 | " " | |
26 | (pp- (get obj (first ks)) 0) | |
27 | (map (fn* [k] (str "\n" (spaces- kindent) | |
28 | (pp- k kindent) | |
29 | " " | |
30 | (pp- (get obj k) vindent))) | |
31 | (rest (keys obj)))))) | |
32 | ||
33 | pp- (fn* [obj indent] | |
34 | (cond | |
35 | (list? obj) (str "(" (pp-seq- obj indent) ")") | |
36 | (vector? obj) (str "[" (pp-seq- obj indent) "]") | |
37 | (map? obj) (str "{" (pp-map- obj indent) "}") | |
38 | :else (pr-str obj))) | |
39 | ||
40 | ] | |
41 | ||
42 | (fn* [obj] | |
43 | (println (pp- obj 0))))) |