RPython: step7
[jackhill/mal.git] / rpython / printer.py
1 import sys
2 IS_RPYTHON = sys.argv[0].endswith('rpython')
3
4 if IS_RPYTHON:
5 from rpython.rlib.rsre import rsre_re as re
6 else:
7 import re
8
9 import mal_types as types
10 from mal_types import (MalType, MalStr, MalSym, MalInt)
11
12 def _pr_str(obj, print_readably=True):
13 assert isinstance(obj, MalType)
14 _r = print_readably
15 if types._list_Q(obj):
16 #return "(" + " ".join(map(lambda e: _pr_str(e,_r), obj.values)) + ")"
17 res = []
18 for e in obj.values:
19 res.append(_pr_str(e,_r))
20 return u"(" + u" ".join(res) + u")"
21 ## elif types._vector_Q(obj):
22 ## return "[" + " ".join(map(lambda e: _pr_str(e,_r), obj)) + "]"
23 ## elif types._hash_map_Q(obj):
24 ## ret = []
25 ## for k in obj.keys():
26 ## ret.extend((_pr_str(k), _pr_str(obj[k],_r)))
27 ## return "{" + " ".join(ret) + "}"
28 elif types._string_Q(obj):
29 assert isinstance(obj, MalStr)
30 val = obj.value
31 if len(val) > 0 and val[0] == u'\u029e':
32 return u':' + val[1:]
33 elif print_readably:
34 return u'"' + types._replace(u'\\n', u'\\n',
35 types._replace(u'\"', u'\\"',
36 types._replace(u'\\', u'\\\\', val))) + u'"'
37 else:
38 return val
39 elif types._nil_Q(obj):
40 return u"nil"
41 elif types._true_Q(obj):
42 return u"true"
43 elif types._false_Q(obj):
44 return u"false"
45 ## elif types._atom_Q(obj):
46 ## return "(atom " + _pr_str(obj.val,_r) + ")"
47 elif types._symbol_Q(obj):
48 assert isinstance(obj, MalSym)
49 return obj.value
50 elif types._int_Q(obj):
51 assert isinstance(obj, MalInt)
52 return unicode(str(obj.value))
53 elif types._function_Q(obj):
54 return u"#<function>"
55 else:
56 return u"unknown"
57