Change quasiquote algorithm
[jackhill/mal.git] / impls / elisp / mal / printer.el
CommitLineData
fbfe6784
NB
1(require 'cl-lib)
2
0195b0ce 3(defun pr-str (form &optional print-readably)
fbfe6784
NB
4 (let ((value (mal-value form)))
5 (cl-ecase (mal-type form)
6 ('nil
0195b0ce 7 "nil")
fbfe6784 8 (true
0195b0ce 9 "true")
fbfe6784 10 (false
0195b0ce 11 "false")
fbfe6784
NB
12 (number
13 (number-to-string value))
14 (string
0195b0ce 15 (if print-readably
a3b3a3cc
VS
16 (let ((print-escape-newlines t))
17 (prin1-to-string value))
0195b0ce 18 value))
fbfe6784 19 ((symbol keyword)
0195b0ce 20 (symbol-name value))
fbfe6784 21 (list
0195b0ce 22 (pr-list value print-readably))
fbfe6784 23 (vector
0195b0ce 24 (pr-vector value print-readably))
fbfe6784 25 (map
a09442e8 26 (pr-map value print-readably))
fbfe6784 27 (fn
a09442e8 28 "#<fn>")
fbfe6784 29 (func
0aee14bb 30 "#<func>")
fbfe6784
NB
31 (atom
32 (format "(atom %s)" (pr-str value print-readably))))))
0195b0ce
VS
33
34(defun pr-list (form print-readably)
35 (let ((items (mapconcat
36 (lambda (item) (pr-str item print-readably))
37 form " ")))
38 (concat "(" items ")")))
39
40(defun pr-vector (form print-readably)
41 (let ((items (mapconcat
42 (lambda (item) (pr-str item print-readably))
43 (append form nil) " ")))
44 (concat "[" items "]")))
45
46(defun pr-map (form print-readably)
47 (let (pairs)
48 (maphash
49 (lambda (key value)
50 (push (cons (pr-str key print-readably)
51 (pr-str value print-readably))
52 pairs))
53 form)
54 (let ((items (mapconcat
55 (lambda (item) (concat (car item) " " (cdr item)))
100fc40c 56 (nreverse pairs) " ")))
0195b0ce 57 (concat "{" items "}"))))
b5df0de6 58
c2b12e5b 59(provide 'mal/printer)