Merge pull request #532 from dubek/vhdl-fix-defmacro
[jackhill/mal.git] / impls / lib / pprint.mal
CommitLineData
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)))))