DISABLE FDs (REMOVE ME).
[jackhill/mal.git] / vimscript / printer.vim
1 " printer module
2
3 function PrStr(ast, readable)
4 let obj = a:ast
5 let r = a:readable
6 if ListQ(obj)
7 let ret = []
8 for e in obj.val
9 call add(ret, PrStr(e, r))
10 endfor
11 return "(" . join(ret, " ") . ")"
12 elseif VectorQ(obj)
13 let ret = []
14 for e in obj.val
15 call add(ret, PrStr(e, r))
16 endfor
17 return "[" . join(ret, " ") . "]"
18 elseif HashQ(obj)
19 let ret = []
20 for [k, v] in items(obj.val)
21 let keyobj = HashParseKey(k)
22 call add(ret, PrStr(keyobj, r))
23 call add(ret, PrStr(v, r))
24 endfor
25 return "{" . join(ret, " ") . "}"
26 elseif MacroQ(obj)
27 let numargs = ListCount(obj.val.params)
28 return "<Macro:" . numargs . "-arguments>"
29 elseif FunctionQ(obj)
30 let numargs = ListCount(obj.val.params)
31 return "<Function:" . numargs . "-arguments>"
32 elseif NativeFunctionQ(obj)
33 let funcname = obj.val.name
34 return "<NativeFunction:" . funcname . ">"
35 elseif AtomQ(obj)
36 return "(atom " . PrStr(obj.val, 1) . ")"
37 elseif KeywordQ(obj)
38 return ':' . obj.val
39 elseif StringQ(obj)
40 if r
41 let str = obj.val
42 let str = substitute(str, '\\', '\\\\', "g")
43 let str = substitute(str, '"', '\\"', "g")
44 let str = substitute(str, "\n", '\\n', "g")
45 return '"' . str . '"'
46 else
47 return obj.val
48 endif
49 elseif NilQ(obj)
50 return "nil"
51 elseif TrueQ(obj)
52 return "true"
53 elseif FalseQ(obj)
54 return "false"
55 elseif IntegerQ(obj) || FloatQ(obj)
56 return string(obj.val)
57 else
58 return obj.val
59 end
60 endfunction