[pypy-commit] lang-scheme default: Implement all numerical comparisions (< <= > >=)

boemmels noreply at buildbot.pypy.org
Mon Jan 9 23:22:51 CET 2012


Author: Juergen Boemmels <boemmels at web.de>
Branch: 
Changeset: r33:82753c10ee59
Date: 2011-12-29 22:37 +0100
http://bitbucket.org/pypy/lang-scheme/changeset/82753c10ee59/

Log:	Implement all numerical comparisions (< <= > >=)

diff --git a/scheme/procedure.py b/scheme/procedure.py
--- a/scheme/procedure.py
+++ b/scheme/procedure.py
@@ -94,9 +94,7 @@
 Mul = create_op_class('*', '', "Mul", 1)
 Div = create_op_class('/', '1 /', "Div")
 
-class Equal(W_Procedure):
-    _symbol_name = "="
-
+class NumberComparison(W_Procedure):
     def procedure(self, ctx, lst):
         if len(lst) < 2:
             return W_Boolean(True)
@@ -109,12 +107,43 @@
             if not isinstance(arg, W_Number):
                 raise WrongArgType(arg, "Number")
 
-            if prev.to_number() != arg.to_number():
+            if not self.relation(prev.to_number(), arg.to_number()):
                 return W_Boolean(False)
             prev = arg
 
         return W_Boolean(True)
 
+class Equal(NumberComparison):
+    _symbol_name = "="
+
+    def relation(self, a, b):
+        return a == b
+
+class LessThen(NumberComparison):
+    _symbol_name = "<"
+
+    def relation(self, a, b):
+        return a < b
+
+class LessEqual(NumberComparison):
+    _symbol_name = "<="
+
+    def relation(self, a, b):
+        return a <= b
+
+class GreaterThen(NumberComparison):
+    _symbol_name = ">"
+
+    def relation(self, a, b):
+        return a > b
+
+class GreaterEqual(NumberComparison):
+    _symbol_name = ">="
+
+    def relation(self, a, b):
+        return a >= b
+
+
 class List(W_Procedure):
     _symbol_name = "list"
 
diff --git a/scheme/test/test_eval.py b/scheme/test/test_eval.py
--- a/scheme/test/test_eval.py
+++ b/scheme/test/test_eval.py
@@ -199,6 +199,21 @@
 
     py.test.raises(WrongArgType, eval_noctx, "(= 'a 1)")
 
+    w_bool = eval_noctx("(< 1 2 3)")
+    assert w_bool.to_boolean() is True
+
+    w_bool = eval_noctx("(< 1 3 2)")
+    assert w_bool.to_boolean() is False
+
+    w_bool = eval_noctx("(> 3 2 1)")
+    assert w_bool.to_boolean() is True
+
+    w_bool = eval_noctx("(<= 1 1 2 2 3)")
+    assert w_bool.to_boolean() is True
+
+    w_bool = eval_noctx("(>= 3 3 1)")
+    assert w_bool.to_boolean() is True
+
 def test_comparison_heteronums():
     w_bool = eval_noctx("(= 1 1.0 1.1)")
     assert w_bool.to_boolean() is False
@@ -839,4 +854,10 @@
 
     py.test.raises(WrongArgType, eval_, ctx, "(append 'a '())")
     py.test.raises(WrongArgType, eval_, ctx, "(append 1 2 3)")
-    py.test.raises(WrongArgType, eval_, ctx, "(append! (cons 1 2) '(3 4))")
\ No newline at end of file
+    py.test.raises(WrongArgType, eval_, ctx, "(append! (cons 1 2) '(3 4))")
+
+def test_not():
+    assert not eval_noctx("(not #t)").to_boolean()
+    assert eval_noctx("(not #f)").to_boolean()
+    assert not eval_noctx("(not '())").to_boolean()
+    assert not eval_noctx("(not 0)").to_boolean()


More information about the pypy-commit mailing list