Author: Juergen Boemmels <[email protected]>
Branch:
Changeset: r14:5a01480a6507
Date: 2011-11-27 00:54 +0100
http://bitbucket.org/pypy/lang-scheme/changeset/5a01480a6507/
Log: Implemented external representaions of objects and write function
diff --git a/scheme/object.py b/scheme/object.py
--- a/scheme/object.py
+++ b/scheme/object.py
@@ -34,6 +34,9 @@
def to_string(self):
return ''
+ def to_repr(self):
+ return "#<unknown>"
+
def to_boolean(self):
return True
@@ -60,9 +63,11 @@
equal = eqv
class W_Undefined(W_Root):
- def to_string(self):
+ def to_repr(self):
return "#<undefined>"
+ to_string = to_repr
+
w_undefined = W_Undefined()
class W_Symbol(W_Root):
@@ -72,9 +77,11 @@
def __init__(self, val):
self.name = val
- def to_string(self):
+ def to_repr(self):
return self.name
+ to_string = to_repr
+
def eval_tr(self, ctx):
w_obj = ctx.get(self.name)
return (w_obj, None)
@@ -98,11 +105,13 @@
def __init__(self, val):
self.boolval = bool(val)
- def to_string(self):
+ def to_repr(self):
if self.boolval:
return "#t"
return "#f"
+ to_string = to_repr
+
def to_boolean(self):
return self.boolval
@@ -120,6 +129,17 @@
def to_string(self):
return self.strval
+ def to_repr(self):
+ str_lst = ["\""]
+ for ch in self.strval:
+ if ch in ["\"", "\\"]:
+ str_lst.append("\\" + ch)
+ else:
+ str_lst.append(ch)
+
+ str_lst.append("\"")
+ return ''.join(str_lst)
+
def __repr__(self):
return "<W_String \"" + self.strval + "\">"
@@ -130,6 +150,9 @@
def to_string(self):
return self.chrval
+ def to_repr(self):
+ return "#\\" + self.chrval
+
def __repr__(self):
return "<W_Character #\\" + self.chrval + ">"
@@ -141,6 +164,10 @@
def to_string(self):
return str(self.realval)
+ def to_repr(self):
+ # return repr(self.realval)
+ return str(float(self.realval))
+
def to_number(self):
return self.to_float()
@@ -184,6 +211,10 @@
def to_string(self):
return str(self.intval)
+ def to_repr(self):
+ #return repr(self.intval)
+ return str(int(self.intval))
+
def to_number(self):
return self.to_fixnum()
@@ -213,9 +244,11 @@
def __repr__(self):
return "<W_Nil ()>"
- def to_string(self):
+ def to_repr(self):
return "()"
+ to_string = to_repr
+
def eval_cf(self, ctx, caller, cont, elst=[], enum=0):
raise SchemeSyntaxError
@@ -239,12 +272,24 @@
return car + " " + cdr.to_lstring()
elif cdr is w_nil: #end of proper list
return car
+ else: #end proper list with dotted
+ return car + " . " + cdr.to_string()
- #end proper list with dotted
- return car + " . " + cdr.to_string()
+ def to_repr(self):
+ return "(" + self.to_lrepr() + ")"
+
+ def to_lrepr(self):
+ car = self.car.to_repr()
+ cdr = self.cdr
+ if isinstance(cdr, W_Pair): #still proper list
+ return car + " " + cdr.to_lrepr()
+ elif cdr is w_nil: #end of proper list
+ return car
+ else: #end proper list with dotted
+ return car + " . " + cdr.to_repr()
def __repr__(self):
- return "<W_Pair " + self.to_string() + ">"
+ return "<W_Pair " + self.to_repr() + ">"
def continue_tr(self, ctx, lst, elst, cnt=True):
oper = elst[0]
@@ -349,9 +394,11 @@
def __init__(self, pname=""):
self.pname = pname
- def to_string(self):
+ def to_repr(self):
return "#<primitive-procedure %s>" % (self.pname,)
+ to_string = to_repr
+
def call_tr(self, ctx, lst):
return self.continue_tr(ctx, lst, [], False)
diff --git a/scheme/procedure.py b/scheme/procedure.py
--- a/scheme/procedure.py
+++ b/scheme/procedure.py
@@ -382,3 +382,17 @@
print
return w_undefined
+class Write(W_Procedure):
+ _symbol_name = "write"
+
+ def procedure(self, ctx, lst):
+ if len(lst) == 1:
+ obj = lst[0]
+ elif len(lst) == 2:
+ (obj, port) = lst
+ raise NotImplementedError
+ else:
+ raise WrongArgsNumber
+
+ print obj.to_repr(),
+ return w_undefined
diff --git a/scheme/test/test_object.py b/scheme/test/test_object.py
--- a/scheme/test/test_object.py
+++ b/scheme/test/test_object.py
@@ -5,16 +5,25 @@
def test_false():
w_false = W_Boolean(False)
assert w_false.to_boolean() is False
+ assert w_false.to_string() == "#f"
+ assert w_false.to_repr() == "#f"
def test_true():
w_true = W_Boolean(True)
assert w_true.to_boolean() is True
+ assert w_true.to_string() == "#t"
+ assert w_true.to_repr() == "#t"
def test_string():
str = "Hello World!"
w_str = W_String(str)
assert str == w_str.to_string()
assert w_str.to_boolean() is True
+ assert w_str.to_repr() == "\"Hello World!\""
+ str = r'''\ \\ \' " \"'''
+ w_str = W_String(str)
+ assert str == w_str.to_string()
+ assert w_str.to_repr() == r'''"\\ \\\\ \\' \" \\\""'''
def test_fixnum():
num = 12345
@@ -22,6 +31,7 @@
assert num == w_num.to_fixnum()
assert float(num) == w_num.to_float()
assert w_num.to_boolean() is True
+ assert w_num.to_repr() == "12345"
def test_float():
num = 12345.567
@@ -29,6 +39,12 @@
assert num == w_num.to_float()
assert int(num) == w_num.to_fixnum()
assert w_num.to_boolean() is True
+ assert w_num.to_repr() == "12345.567"
+
+def test_nil():
+ w_nil = W_Nil()
+ assert w_nil.to_boolean() is True # this is Scheme not LISP
+ assert w_nil.to_repr() == "()"
def test_pair():
c1 = W_Integer(1)
diff --git a/scheme/test/test_output.py b/scheme/test/test_output.py
--- a/scheme/test/test_output.py
+++ b/scheme/test/test_output.py
@@ -25,6 +25,7 @@
("(display 42)", "42"),
("(display \"Hello World!\")", "Hello World!"),
("(display '(1 2 3))", "(1 2 3)"),
+ ("(display #\\c)", "c"),
]
for code, expected in tests:
out = capture_output(lambda: eval_noctx(code))
@@ -33,3 +34,14 @@
def test_newline():
out = capture_output(lambda: eval_noctx("(newline)"))
assert out == "\n"
+
+def test_write():
+ tests = [("(write 'foobar)", "foobar"),
+ ("(write 42)", "42"),
+ ("(write \"Hello World!\")", "\"Hello World!\""),
+ ("(write '(1 (0 0) \"Alice\"))", "(1 (0 0) \"Alice\")"),
+ ("(write #\\c)", "#\\c"),
+ ]
+ for code, expected in tests:
+ out = capture_output(lambda: eval_noctx(code))
+ assert out == expected
_______________________________________________
pypy-commit mailing list
[email protected]
http://mail.python.org/mailman/listinfo/pypy-commit