DISABLE FDs (REMOVE ME).
[jackhill/mal.git] / awk / printer.awk
CommitLineData
8c7587af
MK
1function printer_pr_list(expr, print_readably, idx, len, i, str)
2{
3 idx = substr(expr, 2)
4 len = types_heap[idx]["len"]
5 for (i = 0; i < len; ++i) {
6 str = str printer_pr_str(types_heap[idx][i], print_readably) " "
7 }
8 return substr(str, 1, length(str) - 1)
9}
10
11function printer_pr_hash(expr, print_readably, idx, var, str)
12{
13 idx = substr(expr, 2)
14 for (var in types_heap[idx]) {
15 switch (var) {
16 case /^"/:
17 str = str printer_pr_string(var, print_readably) " " printer_pr_str(types_heap[idx][var], print_readably) " "
18 break
19 case /^:/:
20 str = str substr(var, 2) " " printer_pr_str(types_heap[idx][var], print_readably) " "
21 break
22 }
23 }
24 return substr(str, 1, length(str) - 1)
25}
26
27function printer_pr_string(expr, print_readably, v, r)
28{
29 if (!print_readably) {
30 return substr(expr, 2)
31 }
32 expr = substr(expr, 2)
33 while (match(expr, /["\n\\]/, r)) {
34 v = v substr(expr, 1, RSTART - 1) (r[0] == "\n" ? "\\n" : "\\" r[0])
35 expr = substr(expr, RSTART + RLENGTH)
36 }
37 return "\"" v expr "\""
38}
39
40function printer_pr_str(expr, print_readably, var)
41{
42 switch (expr) {
43 case /^\(/:
44 return "(" printer_pr_list(expr, print_readably) ")"
45 case /^\[/:
46 return "[" printer_pr_list(expr, print_readably) "]"
47 case /^\{/:
48 return "{" printer_pr_hash(expr, print_readably) "}"
49 case /^"/:
50 return printer_pr_string(expr, print_readably)
51 case /^\$/:
52 var = substr(expr, 2)
53 return "#<Function> (fn* " printer_pr_str(types_heap[var]["params"], print_readably) " " printer_pr_str(types_heap[var]["body"], print_readably) ")"
54 case /^&/:
55 return "#<BuiltinFunction " env_builtinnames[substr(expr, 2)] ">"
56 case /^%/:
57 return "#<BuiltinFunction " env_builtinnames[types_heap[substr(expr, 2)]["func"]] ">"
58 case /^\?/:
59 return "(atom " printer_pr_str(types_heap[substr(expr, 2)]["obj"], print_readably) ")"
60 default:
61 return substr(expr, 2)
62 }
63}