Merge branch 'master' into chuck-implementation
[jackhill/mal.git] / rpython / printer.py
CommitLineData
80320efc
JM
1import sys
2IS_RPYTHON = sys.argv[0].endswith('rpython')
3
4if IS_RPYTHON:
5 from rpython.rlib.rsre import rsre_re as re
6else:
7 import re
8
9import mal_types as types
23fa1b11
JM
10from mal_types import (MalType, MalStr, MalSym, MalInt,
11 nil, true, false, MalAtom, MalFunc)
80320efc 12
8855a05a
JM
13def _pr_a_str(s, print_readably=True):
14 if len(s) > 0 and s[0] == u'\u029e':
15 return u':' + s[1:]
16 elif print_readably:
8d78bc26 17 return u'"' + types._replace(u'\n', u'\\n',
8855a05a 18 types._replace(u'\"', u'\\"',
8d78bc26 19 types._replace(u'\\', u'\\\\', s))) + u'"'
8855a05a
JM
20 else:
21 return s
22
80320efc
JM
23def _pr_str(obj, print_readably=True):
24 assert isinstance(obj, MalType)
25 _r = print_readably
26 if types._list_Q(obj):
80320efc
JM
27 res = []
28 for e in obj.values:
29 res.append(_pr_str(e,_r))
f0cd1318 30 return u"(" + u" ".join(res) + u")"
8855a05a
JM
31 elif types._vector_Q(obj):
32 res = []
33 for e in obj.values:
34 res.append(_pr_str(e,_r))
35 return u"[" + u" ".join(res) + u"]"
36 elif types._hash_map_Q(obj):
37 ret = []
38 for k in obj.dct.keys():
39 ret.append(_pr_a_str(k,_r))
40 ret.append(_pr_str(obj.dct[k],_r))
41 return u"{" + u" ".join(ret) + u"}"
23fa1b11 42 elif isinstance(obj, MalStr):
8855a05a 43 return _pr_a_str(obj.value,_r)
23fa1b11 44 elif obj is nil:
f0cd1318 45 return u"nil"
23fa1b11 46 elif obj is true:
f0cd1318 47 return u"true"
23fa1b11 48 elif obj is false:
f0cd1318 49 return u"false"
fdf80511
JM
50 elif types._atom_Q(obj):
51 return u"(atom " + _pr_str(obj.get_value(),_r) + u")"
23fa1b11 52 elif isinstance(obj, MalSym):
80320efc 53 return obj.value
23fa1b11 54 elif isinstance(obj, MalInt):
f0cd1318 55 return unicode(str(obj.value))
23fa1b11 56 elif isinstance(obj, MalFunc):
b0a9121d 57 return u"#<function>"
80320efc 58 else:
f0cd1318 59 return u"unknown"
80320efc 60