3 import mal_types
as types
4 from mal_types
import (MalType
, nil
, true
, false
,
5 MalInt
, MalStr
, MalList
)
12 if types
._equal
_Q
(args
[0], args
[1]): return true
16 #def throw(exc): raise Exception(exc)
22 for exp
in args
.values
: parts
.append(printer
._pr
_str
(exp
, True))
23 return MalStr(u
" ".join(parts
))
27 for exp
in args
.values
: parts
.append(printer
._pr
_str
(exp
, False))
28 return MalStr(u
"".join(parts
))
32 for exp
in args
.values
: parts
.append(printer
._pr
_str
(exp
, True))
33 print(u
" ".join(parts
))
38 for exp
in args
.values
: parts
.append(printer
._pr
_str
(exp
, False))
39 print(u
" ".join(parts
))
44 assert isinstance(a0
, MalStr
)
45 return reader
.read_str(str(a0
.value
))
49 assert isinstance(a0
, MalStr
)
50 return MalStr(unicode(open(str(a0
.value
)).read()))
54 a
, b
= args
[0], args
[1]
55 assert isinstance(a
, MalInt
)
56 assert isinstance(b
, MalInt
)
57 if a
.value
< b
.value
: return true
60 a
, b
= args
[0], args
[1]
61 assert isinstance(a
, MalInt
)
62 assert isinstance(b
, MalInt
)
63 if a
.value
<= b
.value
: return true
66 a
, b
= args
[0], args
[1]
67 assert isinstance(a
, MalInt
)
68 assert isinstance(b
, MalInt
)
69 if a
.value
> b
.value
: return true
72 a
, b
= args
[0], args
[1]
73 assert isinstance(a
, MalInt
)
74 assert isinstance(b
, MalInt
)
75 if a
.value
>= b
.value
: return true
79 a
, b
= args
[0], args
[1]
80 assert isinstance(a
, MalInt
)
81 assert isinstance(b
, MalInt
)
82 return MalInt(a
.value
+b
.value
)
84 a
, b
= args
[0], args
[1]
85 assert isinstance(a
, MalInt
)
86 assert isinstance(b
, MalInt
)
87 return MalInt(a
.value
-b
.value
)
89 a
, b
= args
[0], args
[1]
90 assert isinstance(a
, MalInt
)
91 assert isinstance(b
, MalInt
)
92 return MalInt(a
.value
*b
.value
)
94 a
, b
= args
[0], args
[1]
95 assert isinstance(a
, MalInt
)
96 assert isinstance(b
, MalInt
)
97 return MalInt(int(a
.value
/b
.value
))
100 ## Hash map functions
101 #def assoc(src_hm, *key_vals):
102 # hm = copy.copy(src_hm)
103 # for i in range(0,len(key_vals),2): hm[key_vals[i]] = key_vals[i+1]
106 #def dissoc(src_hm, *keys):
107 # hm = copy.copy(src_hm)
109 # if key in hm: del hm[key]
113 # if hm and key in hm:
118 #def contains_Q(hm, key): return key in hm
120 #def keys(hm): return types._list(*hm.keys())
122 #def vals(hm): return types._list(*hm.values())
127 assert isinstance(ml
, MalList
)
131 if isinstance(args
[0], MalList
): return true
135 assert isinstance(args
, MalType
)
137 if isinstance(seq
, MalList
):
138 if len(seq
) == 0: return true
143 raise Exception("empty? called on non-sequence")
146 assert isinstance(args
, MalType
)
148 if isinstance(seq
, MalList
):
149 return MalInt(len(seq
))
153 raise Exception("count called on non-sequence")
155 #def coll_Q(coll): return sequential_Q(coll) or hash_map_Q(coll)
158 x
, seq
= args
[0], args
[1]
159 assert isinstance(seq
, MalList
)
160 return MalList([x
] + seq
.values
)
164 for l
in args
.values
:
165 assert isinstance(l
, MalList
)
166 new_lst
= new_lst
+ l
.values
167 return MalList(new_lst
)
170 lst
, idx
= args
[0], args
[1]
171 assert isinstance(lst
, MalList
)
172 assert isinstance(idx
, MalInt
)
173 if idx
.value
< len(lst
): return lst
[idx
.value
]
174 else: raise Exception("nth: index out of range")
178 assert isinstance(a0
, MalList
)
179 if len(a0
) == 0: return nil
184 assert isinstance(a0
, MalList
)
185 if len(a0
) == 0: return MalList([])
186 else: return a0
.rest()
189 #def conj(lst, *args):
190 # if types._list_Q(lst):
191 # new_lst = List(list(reversed(list(args))) + lst)
193 # new_lst = Vector(lst + list(args))
194 # if hasattr(lst, "__meta__"):
195 # new_lst.__meta__ = lst.__meta__
198 #def apply(f, *args): return f(*(list(args[0:-1])+args[-1]))
200 #def mapf(f, lst): return List(map(f, lst))
203 ## Metadata functions
204 #def with_meta(obj, meta):
205 # new_obj = types._clone(obj)
206 # new_obj.__meta__ = meta
210 # if hasattr(obj, "__meta__"): return obj.__meta__
215 #def deref(atm): return atm.val
216 #def reset_BANG(atm,val):
219 #def swap_BANG(atm,f,*args):
220 # atm.val = f(atm.val,*args)
227 # 'nil?': types._nil_Q,
228 # 'true?': types._true_Q,
229 # 'false?': types._false_Q,
230 # 'symbol': types._symbol,
231 # 'symbol?': types._symbol_Q,
232 # 'keyword': types._keyword,
233 # 'keyword?': types._keyword_Q,
239 # 'readline': lambda prompt: mal_readline.readline(prompt),
240 'read-string': read_str
,
250 # 'time-ms': lambda : int(time.time() * 1000),
254 # 'vector': types._vector,
255 # 'vector?': types._vector_Q,
256 # 'hash-map': types._hash_map,
257 # 'map?': types._hash_map_Q,
261 # 'contains?': contains_Q,
265 # 'sequential?': types._sequential_Q,
277 # 'with-meta': with_meta,
279 # 'atom': types._atom,
280 # 'atom?': types._atom_Q,
282 # 'reset!': reset_BANG,