[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