elisp: Get rid of newline hack in printer
[jackhill/mal.git] / elisp / printer.el
1 (defun pr-str (form &optional print-readably)
2 (let ((type (mal-type form))
3 (value (mal-value form)))
4 (cond
5 ((eq type 'nil)
6 "nil")
7 ((eq type 'true)
8 "true")
9 ((eq type 'false)
10 "false")
11 ((eq type 'number)
12 (number-to-string (mal-value form)))
13 ((eq type 'string)
14 (if print-readably
15 (let ((print-escape-newlines t))
16 (prin1-to-string value))
17 value))
18 ((or (eq type 'symbol) (eq type 'keyword))
19 (symbol-name value))
20 ((eq type 'list)
21 (pr-list value print-readably))
22 ((eq type 'vector)
23 (pr-vector value print-readably))
24 ((eq type 'map)
25 (pr-map value print-readably))
26 ((eq type 'fn)
27 "#<fn>")
28 ((eq type 'func)
29 "#<func>")
30 ((eq type 'atom)
31 (format "(atom %s)" (mal-value value))))))
32
33 (defun pr-list (form print-readably)
34 (let ((items (mapconcat
35 (lambda (item) (pr-str item print-readably))
36 form " ")))
37 (concat "(" items ")")))
38
39 (defun pr-vector (form print-readably)
40 (let ((items (mapconcat
41 (lambda (item) (pr-str item print-readably))
42 (append form nil) " ")))
43 (concat "[" items "]")))
44
45 (defun pr-map (form print-readably)
46 (let (pairs)
47 (maphash
48 (lambda (key value)
49 (push (cons (pr-str key print-readably)
50 (pr-str value print-readably))
51 pairs))
52 form)
53 (let ((items (mapconcat
54 (lambda (item) (concat (car item) " " (cdr item)))
55 (nreverse pairs) " ")))
56 (concat "{" items "}"))))