Merge pull request #374 from sgtatham/vala-fixes
[jackhill/mal.git] / vimscript / printer.vim
CommitLineData
50a964ce
DM
1" printer module
2
3function PrStr(ast, readable)
4 let obj = a:ast
5 let r = a:readable
6 if ListQ(obj)
7 let ret = []
82641edb 8 for e in obj.val
50a964ce
DM
9 call add(ret, PrStr(e, r))
10 endfor
11 return "(" . join(ret, " ") . ")"
12 elseif VectorQ(obj)
13 let ret = []
82641edb 14 for e in obj.val
50a964ce
DM
15 call add(ret, PrStr(e, r))
16 endfor
17 return "[" . join(ret, " ") . "]"
18 elseif HashQ(obj)
19 let ret = []
82641edb 20 for [k, v] in items(obj.val)
50a964ce
DM
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)
82641edb 27 let numargs = ListCount(obj.val.params)
50a964ce
DM
28 return "<Macro:" . numargs . "-arguments>"
29 elseif FunctionQ(obj)
82641edb 30 let numargs = ListCount(obj.val.params)
50a964ce
DM
31 return "<Function:" . numargs . "-arguments>"
32 elseif NativeFunctionQ(obj)
82641edb 33 let funcname = obj.val.name
50a964ce
DM
34 return "<NativeFunction:" . funcname . ">"
35 elseif AtomQ(obj)
82641edb 36 return "(atom " . PrStr(obj.val, 1) . ")"
50a964ce 37 elseif KeywordQ(obj)
82641edb 38 return ':' . obj.val
50a964ce
DM
39 elseif StringQ(obj)
40 if r
82641edb 41 let str = obj.val
50a964ce
DM
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
82641edb 47 return obj.val
50a964ce
DM
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)
82641edb 56 return string(obj.val)
50a964ce 57 else
82641edb 58 return obj.val
50a964ce
DM
59 end
60endfunction