SIGN IN SIGN UP
2015-10-20 15:02:00 -04:00
" printer module
function PrStr(ast, readable)
let obj = a:ast
let r = a:readable
if ListQ(obj)
let ret = []
2016-10-26 06:46:20 +00:00
for e in obj.val
2015-10-20 15:02:00 -04:00
call add(ret, PrStr(e, r))
endfor
return "(" . join(ret, " ") . ")"
elseif VectorQ(obj)
let ret = []
2016-10-26 06:46:20 +00:00
for e in obj.val
2015-10-20 15:02:00 -04:00
call add(ret, PrStr(e, r))
endfor
return "[" . join(ret, " ") . "]"
elseif HashQ(obj)
let ret = []
2016-10-26 06:46:20 +00:00
for [k, v] in items(obj.val)
2015-10-20 15:02:00 -04:00
let keyobj = HashParseKey(k)
call add(ret, PrStr(keyobj, r))
call add(ret, PrStr(v, r))
endfor
return "{" . join(ret, " ") . "}"
elseif MacroQ(obj)
2016-10-26 06:46:20 +00:00
let numargs = ListCount(obj.val.params)
2015-10-20 15:02:00 -04:00
return "<Macro:" . numargs . "-arguments>"
elseif FunctionQ(obj)
2016-10-26 06:46:20 +00:00
let numargs = ListCount(obj.val.params)
2015-10-20 15:02:00 -04:00
return "<Function:" . numargs . "-arguments>"
elseif NativeFunctionQ(obj)
2016-10-26 06:46:20 +00:00
let funcname = obj.val.name
2015-10-20 15:02:00 -04:00
return "<NativeFunction:" . funcname . ">"
elseif AtomQ(obj)
2016-10-26 06:46:20 +00:00
return "(atom " . PrStr(obj.val, 1) . ")"
2015-10-20 15:02:00 -04:00
elseif KeywordQ(obj)
2016-10-26 06:46:20 +00:00
return ':' . obj.val
2015-10-20 15:02:00 -04:00
elseif StringQ(obj)
if r
2016-10-26 06:46:20 +00:00
let str = obj.val
2015-10-20 15:02:00 -04:00
let str = substitute(str, '\\', '\\\\', "g")
let str = substitute(str, '"', '\\"', "g")
let str = substitute(str, "\n", '\\n', "g")
return '"' . str . '"'
else
2016-10-26 06:46:20 +00:00
return obj.val
2015-10-20 15:02:00 -04:00
endif
elseif NilQ(obj)
return "nil"
elseif TrueQ(obj)
return "true"
elseif FalseQ(obj)
return "false"
elseif IntegerQ(obj) || FloatQ(obj)
2016-10-26 06:46:20 +00:00
return string(obj.val)
2015-10-20 15:02:00 -04:00
else
2016-10-26 06:46:20 +00:00
return obj.val
2015-10-20 15:02:00 -04:00
end
endfunction