Merge pull request #406 from chr15m/lib-alias-hacks
[jackhill/mal.git] / logo / printer.lg
CommitLineData
4eb88ef2
DM
1load "../logo/types.lg
2
3to pr_str :exp :readable
4if emptyp :exp [output []]
5output case obj_type :exp [
6 [[nil] "nil]
7 [[true] "true]
8 [[false] "false]
9 [[number] obj_val :exp]
10 [[symbol] obj_val :exp]
11 [[keyword] word ": obj_val :exp]
12 [[string] print_string :exp :readable]
13 [[list] pr_seq obj_val :exp :readable "\( "\) :space_char]
14 [[vector] pr_seq obj_val :exp :readable "\[ "\] :space_char]
15 [[hashmap] pr_seq obj_val :exp :readable "\{ "\} :space_char]
16 [[atom] (word "\(atom :space_char pr_str obj_val :exp :readable "\) ) ]
17 [[nativefn] (word "#<NativeFunction: obj_val :exp ">) ]
18 [[fn] (word "#<Function:args= pr_str fn_args :exp :readable ", :space_char "macro= fn_is_macro :exp ">) ]
19 [else (throw "error (sentence [unknown type] obj_type :exp))]
20]
21end
22
23to escape_string :s
24localmake "i 1
25localmake "res "
26while [:i <= count :s] [
27 localmake "c item :i :s
28 make "res word :res cond [
29 [[ :c = "\\ ] "\\\\ ]
30 [[ :c = char 10 ] "\\n ]
31 [[ :c = "\" ] "\\\" ]
32 [else :c ]
33 ]
34 make "i (:i + 1)
35]
36output :res
37end
38
39to print_string :exp :readable
40ifelse :readable [
41 output (word "\" escape_string obj_val :exp "\" )
42] [
43 output obj_val :exp
44]
45end
46
47to pr_seq :seq :readable :start_char :end_char :delim_char
48localmake "res :start_char
49foreach :seq [
50 if # > 1 [make "res word :res :delim_char]
51 make "res word :res pr_str ? :readable
52]
53output word :res :end_char
54end