Commit | Line | Data |
---|---|---|
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) |