[pypy-svn] r45678 - in pypy/dist/pypy/lang/scheme: . test
jlg at codespeak.net
jlg at codespeak.net
Wed Aug 15 14:54:18 CEST 2007
Author: jlg
Date: Wed Aug 15 14:54:14 2007
New Revision: 45678
Modified:
pypy/dist/pypy/lang/scheme/object.py
pypy/dist/pypy/lang/scheme/test/test_eval.py
Log:
eq? and eqv? procedures implemented
Modified: pypy/dist/pypy/lang/scheme/object.py
==============================================================================
--- pypy/dist/pypy/lang/scheme/object.py (original)
+++ pypy/dist/pypy/lang/scheme/object.py Wed Aug 15 14:54:14 2007
@@ -54,6 +54,11 @@
def eval_tr(self, ctx):
return (self, None)
+ def eqv(self, w_obj):
+ return self is w_obj
+
+ eq = eqv
+
class W_Undefined(W_Root):
def to_string(self):
return "#<undefined>"
@@ -77,9 +82,6 @@
w_obj = ctx.get(self.name)
return (w_obj, None)
- def eq_symbol(self, w_symb):
- return w_symb is self
-
w_ellipsis = W_Symbol("...")
def symbol(name):
@@ -110,6 +112,13 @@
def __repr__(self):
return "<W_Boolean " + str(self.boolval) + ">"
+ def eqv(self, w_obj):
+ if isinstance(w_obj, W_Boolean):
+ return self.boolval is w_obj.boolval
+ return False
+
+ eq = eqv
+
class W_String(W_Root):
def __init__(self, val):
self.strval = val
@@ -154,6 +163,11 @@
def is_integer(self):
return self.realval == self.round()
+ def eqv(self, w_obj):
+ return isinstance(w_obj, W_Real) \
+ and self.exact is w_obj.exact \
+ and self.realval == w_obj.realval
+
W_Number = W_Real
class W_Integer(W_Real):
@@ -646,7 +660,6 @@
return w_promise.force(ctx)
-#XXX no tests in eval
class EqP(W_Procedure):
_symbol_name = "eq?"
@@ -654,7 +667,18 @@
if len(lst) != 2:
raise WrongArgsNumber
- return W_Boolean(lst[0] is lst[1])
+ (a, b) = lst
+ return W_Boolean(a.eq(b))
+
+class EqvP(W_Procedure):
+ _symbol_name = "eqv?"
+
+ def procedure(self, ctx, lst):
+ if len(lst) != 2:
+ raise WrongArgsNumber
+
+ (a, b) = lst
+ return W_Boolean(a.eqv(b))
##
# Predicate
@@ -1202,7 +1226,7 @@
if isinstance(w_pattcdr, W_Pair) and \
w_pattcdr.car is w_ellipsis:
if not isinstance(w_pattcar, W_Symbol):
- #XXX this must be added
+ #XXX this must be added (with tests)
#print w_patt, "matched to ()"
raise NotImplementedError
return {w_pattcar.name: Ellipsis([])}
Modified: pypy/dist/pypy/lang/scheme/test/test_eval.py
==============================================================================
--- pypy/dist/pypy/lang/scheme/test/test_eval.py (original)
+++ pypy/dist/pypy/lang/scheme/test/test_eval.py Wed Aug 15 14:54:14 2007
@@ -655,7 +655,71 @@
assert eval_(ctx, "(procedure? +)").to_boolean() is True
assert eval_(ctx, "(procedure? (lambda () 1))").to_boolean() is True
+def test_eqv():
+ ctx = ExecutionContext()
+
+ assert eval_(ctx, "(eqv? #t #t)").to_boolean() is True
+ assert eval_(ctx, "(eqv? #f #f)").to_boolean() is True
+ assert eval_(ctx, "(eqv? 'symb 'symb)").to_boolean() is True
+ assert eval_(ctx, "(eqv? 'symb 'SYMB)").to_boolean() is True
+ assert eval_(ctx, "(eqv? 42 42)").to_boolean() is True
+ assert eval_(ctx, "(eqv? 42.1 42.1)").to_boolean() is True
+ #assert eval_(ctx, "(eqv? #\a #\a)").to_boolean() is True
+ assert eval_(ctx, "(eqv? '() '())").to_boolean() is True
+ assert eval_(ctx, """(let ((p (cons 1 2)))
+ (eqv? p p))""").to_boolean() is True
+ #assert eval_(ctx, """(let ((p "a string"))
+ # (eqv? p p))""").to_boolean() is True
+ assert eval_(ctx, """(let ((p (lambda (x) x)))
+ (eqv? p p))""").to_boolean() is True
+
+ assert eval_(ctx, "(eqv? #t 'symb)").to_boolean() is False
+ assert eval_(ctx, "(eqv? #f 42)").to_boolean() is False
+ assert eval_(ctx, "(eqv? #t #f)").to_boolean() is False
+ assert eval_(ctx, "(eqv? 'symb1 'symb2)").to_boolean() is False
+ assert eval_(ctx, "(eqv? 42 42.0)").to_boolean() is False
+ assert eval_(ctx, "(eqv? 42.0 42)").to_boolean() is False
+ assert eval_(ctx, "(eqv? 42 43)").to_boolean() is False
+ assert eval_(ctx, "(eqv? 42.1 42.2)").to_boolean() is False
+ #assert eval_(ctx, "(eqv? #\a #\b)").to_boolean() is False
+ assert eval_(ctx, "(eqv? (cons 1 2) (cons 1 2))").to_boolean() is False
+ #assert eval_(ctx, """(eqv? "a string"
+ # "a string")""").to_boolean() is False
+ assert eval_(ctx, """(eqv? (lambda () 1)
+ (lambda () 2))""").to_boolean() is False
+
def test_eq():
- #XXX must be added soon!
- py.test.skip("to lazy to write it now")
+ ctx = ExecutionContext()
+
+ assert eval_(ctx, "(eq? #t #t)").to_boolean() is True
+ assert eval_(ctx, "(eq? #f #f)").to_boolean() is True
+ assert eval_(ctx, "(eq? 'symb 'symb)").to_boolean() is True
+ assert eval_(ctx, "(eq? 'symb 'SYMB)").to_boolean() is True
+ assert eval_(ctx, "(eq? '() '())").to_boolean() is True
+ assert eval_(ctx, """(let ((n 42))
+ (eq? n n))""").to_boolean() is True
+ assert eval_(ctx, """(let ((p (cons 1 2)))
+ (eq? p p))""").to_boolean() is True
+ #assert eval_(ctx, """(let ((p "a string"))
+ # (eq? p p))""").to_boolean() is True
+ assert eval_(ctx, """(let ((p (lambda (x) x)))
+ (eq? p p))""").to_boolean() is True
+
+ assert eval_(ctx, "(eq? #t 'symb)").to_boolean() is False
+ assert eval_(ctx, "(eq? #f 42)").to_boolean() is False
+ assert eval_(ctx, "(eq? #t #f)").to_boolean() is False
+ assert eval_(ctx, "(eq? 'symb1 'symb2)").to_boolean() is False
+ assert eval_(ctx, "(eq? 42 42)").to_boolean() is False
+ assert eval_(ctx, "(eq? 42.1 42.1)").to_boolean() is False
+ #assert eval_(ctx, "(eq? #\a #\a)").to_boolean() is False
+ assert eval_(ctx, "(eq? 42 42.0)").to_boolean() is False
+ assert eval_(ctx, "(eq? 42.0 42)").to_boolean() is False
+ assert eval_(ctx, "(eq? 42 43)").to_boolean() is False
+ assert eval_(ctx, "(eq? 42.1 42.2)").to_boolean() is False
+ #assert eval_(ctx, "(eq? #\a #\b)").to_boolean() is False
+ assert eval_(ctx, "(eq? (cons 1 2) (cons 1 2))").to_boolean() is False
+ #assert eval_(ctx, """(eq? "a string"
+ # "a string")""").to_boolean() is False
+ assert eval_(ctx, """(eq? (lambda () 1)
+ (lambda () 2))""").to_boolean() is False
More information about the Pypy-commit
mailing list