Skip to content

Commit 54e95c3

Browse files
committed
added strings and IObject
1 parent 304b3ec commit 54e95c3

8 files changed

Lines changed: 82 additions & 8 deletions

File tree

pixie/vm/code.py

Lines changed: 15 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -222,6 +222,14 @@ def get_var_if_defined(ns, name):
222222

223223

224224

225+
class DefaultProtocolFn(NativeFn):
226+
def __init__(self, pfn):
227+
self._pfn = pfn
228+
229+
def _invoke(self, args):
230+
from pixie.vm.string import String
231+
tp = args[0].type()._name
232+
raise Exception("No override for " + tp + " on " + self._pfn._name + " in protocol " + self._pfn._protocol._name)
225233

226234

227235
class Protocol(object.Object):
@@ -232,6 +240,7 @@ def __init__(self, name):
232240
self._polyfns = {}
233241
self._satisfies = {}
234242

243+
235244
def add_method(self, pfn):
236245
self._polyfns[pfn] = pfn
237246

@@ -251,17 +260,21 @@ def __init__(self, name, protocol):
251260
self._dict = {}
252261
self._rev = 0
253262
self._protocol = protocol
263+
self._default_fn = DefaultProtocolFn(self)
254264
protocol.add_method(self)
255265

256266
def extend(self, tp, fn):
257267
self._dict[tp] = fn
258268
self._rev += 1
259269
self._protocol.add_satisfies(tp)
260270

271+
def set_default_fn(self, fn):
272+
self._default_fn = fn
273+
self._rev += 1
274+
261275
def _invoke(self, args):
262276
a = args[0].type()
263-
fn = self._dict.get(a, None)
264-
assert fn is not None, "No override for " + self._name + " for type " + a._name
277+
fn = self._dict.get(a, self._default_fn)
265278
return fn.invoke(args)
266279

267280
class DoublePolymorphicFn(BaseCode):

pixie/vm/keyword.py

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -8,6 +8,9 @@ class Keyword(Object):
88
def __init__(self, name):
99
self._name = name
1010

11+
def type(self):
12+
return Keyword._type
13+
1114

1215
class KeywordCache(object):
1316
def __init__(self):

pixie/vm/numbers.py

Lines changed: 14 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -66,3 +66,17 @@ def eq(a, b):
6666

6767
raise Exception("Add error")
6868

69+
70+
def init():
71+
import pixie.vm.protocols as proto
72+
from pixie.vm.string import String
73+
74+
@extend(proto._str, Integer._type)
75+
def _str(i):
76+
return String(str(i.int_val()))
77+
78+
@extend(proto._repr, Integer._type)
79+
def _repr(i):
80+
return String(str(i.int_val()))
81+
82+

pixie/vm/object.py

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -5,7 +5,7 @@ class Object(object):
55
"""
66

77
def type(self):
8-
assert False;
8+
assert False, str(self)
99

1010
class Type(Object):
1111

pixie/vm/protocols.py

Lines changed: 18 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -2,7 +2,7 @@
22
from pixie.vm.code import BaseCode, PolymorphicFn, wrap_fn, as_var, defprotocol, extend
33
from types import MethodType
44
from pixie.vm.primitives import true, false, nil
5-
from pixie.vm.numbers import Integer, zero_int, _add
5+
import pixie.vm.numbers as numbers
66
import rpython.rlib.jit as jit
77
import rpython.rlib.rstacklet as rstacklet
88

@@ -16,6 +16,16 @@
1616

1717
defprotocol("pixie.stdlib", "IPersistentCollection", ["-conj"])
1818

19+
defprotocol("pixie.stdlib", "IObject", ["-hash", "-eq", "-str", "-repr"])
20+
21+
def default_str(x):
22+
from pixie.vm.string import String
23+
24+
return String("<inst " + x.type()._name + ">")
25+
26+
_str.set_default_fn(wrap_fn(default_str))
27+
_repr.set_default_fn(wrap_fn(default_str))
28+
1929
#_first = PolymorphicFn("-first")
2030
#_next = PolymorphicFn("-next")
2131

@@ -51,7 +61,7 @@ def _seq(_):
5161

5262
@extend(_count, nil._type)
5363
def _count(_):
54-
return zero_int
64+
return numbers.zero_int
5565

5666

5767
_count_driver = jit.JitDriver(name="pixie.stdlib.count",
@@ -63,7 +73,7 @@ def count(x):
6373
while True:
6474
_count_driver.jit_merge_point(tp=rt.type(x))
6575
if ICounted.satisfies(rt.type(x)):
66-
return rt._add(Integer(acc), rt._count(x))
76+
return rt._add(numbers.Integer(acc), rt._count(x))
6777
acc += 1
6878
x = rt.next(rt.seq(x))
6979

@@ -81,5 +91,10 @@ def nth(a, b):
8191
return rt._nth(a, b)
8292

8393

94+
@as_var("str")
95+
def str(a):
96+
return rt._str(a)
8497

8598
import pixie.vm.rt as rt
99+
100+

pixie/vm/rt.py

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -7,7 +7,8 @@ def init():
77
if globals().has_key("__inited__"):
88
return
99

10-
import pixie.vm.numbers
10+
import pixie.vm.numbers as numbers
11+
numbers.init()
1112

1213
from pixie.vm.code import _ns_registry, BaseCode, munge
1314

pixie/vm/string.py

Lines changed: 21 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,21 @@
1+
import pixie.vm.rt as rt
2+
from pixie.vm.object import Object, Type
3+
from pixie.vm.code import extend, as_var
4+
import pixie.vm.protocols as proto
5+
6+
class String(Object):
7+
_type = Type("pixie.stdlib.String")
8+
9+
def type(self):
10+
return String._type
11+
12+
def __init__(self, s):
13+
self._str = s
14+
15+
@extend(proto._str, String._type)
16+
def _str(x):
17+
return x
18+
19+
@extend(proto._repr, String._type)
20+
def _repr(self):
21+
return "\"" + self._str + "\""

target.py

Lines changed: 8 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -43,10 +43,17 @@ def entry_point(foo=None):
4343
# ((create-stacklet foo) 0))
4444
# """), True)))
4545
from pixie.vm.keyword import keyword
46+
import pixie.vm.rt as rt
47+
from pixie.vm.string import String
48+
49+
rdr = PromptReader()
4650
while True:
47-
val = interpret(compile(read(PromptReader(), True)))
51+
val = interpret(compile(read(rdr, True)))
4852
if val is keyword("exit-repl"):
4953
break
54+
val = rt.str(val)
55+
assert isinstance(val, String), "str should always return a string"
56+
print val._str
5057

5158
return 0
5259

0 commit comments

Comments
 (0)