2019-05-15 15:06:26 +02:00
|
|
|
;; Pretty printer a MAL object.
|
|
|
|
|
|
2019-05-15 15:49:35 +02:00
|
|
|
(def! pprint
|
|
|
|
|
|
|
|
|
|
(let* [
|
|
|
|
|
|
|
|
|
|
spaces- (fn* [indent]
|
|
|
|
|
(if (> indent 0)
|
|
|
|
|
(str " " (spaces- (- indent 1)))
|
|
|
|
|
""))
|
|
|
|
|
|
|
|
|
|
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)))))
|
|
|
|
|
|
|
|
|
|
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)))
|
2021-09-10 16:56:32 +02:00
|
|
|
(rest ks)))))
|
2019-05-15 15:49:35 +02:00
|
|
|
|
|
|
|
|
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)))
|
|
|
|
|
|
|
|
|
|
]
|
|
|
|
|
|
|
|
|
|
(fn* [obj]
|
|
|
|
|
(println (pp- obj 0)))))
|