[pypy-svn] r44705 - in pypy/dist/pypy/lang/scheme: . test

jlg at codespeak.net jlg at codespeak.net
Tue Jul 3 17:28:13 CEST 2007


Author: jlg
Date: Tue Jul  3 17:28:13 2007
New Revision: 44705

Modified:
   pypy/dist/pypy/lang/scheme/object.py
   pypy/dist/pypy/lang/scheme/test/test_eval.py
Log:
number comparison: Equal; recursive factorial lambda test

Modified: pypy/dist/pypy/lang/scheme/object.py
==============================================================================
--- pypy/dist/pypy/lang/scheme/object.py	(original)
+++ pypy/dist/pypy/lang/scheme/object.py	Tue Jul  3 17:28:13 2007
@@ -90,6 +90,9 @@
     def to_float(self):
         return float(self.fixnumval)
 
+    def equal(self, w_obj):
+        return self.fixnumval == w_obj.to_number()
+
 class W_Float(W_Root):
     def __init__(self, val):
         self.floatval = float(val)
@@ -106,6 +109,9 @@
     def to_float(self):
         return self.floatval
 
+    def equal(self, w_obj):
+        return self.floatval == w_obj.to_number()
+
 class W_Pair(W_Root):
     def __init__(self, car, cdr):
         self.car = car
@@ -255,6 +261,12 @@
         w_pair = lst.car.eval(ctx)
         return w_pair.cdr
 
+class Equal(W_Procedure):
+    def procedure(self, ctx, lst):
+        w_first = lst.car.eval(ctx)
+        w_second = lst.cdr.car.eval(ctx)
+        return W_Boolean(w_first.equal(w_second))
+
 class Lambda(W_Macro):
     def eval(self, ctx, lst):
         w_args = lst.car
@@ -276,14 +288,19 @@
 ##
 OMAP = \
     {
+            #arithmetic operations
         '+': Add,
         '-': Sub,
         '*': Mul,
-        'define': Define,
-        'if': MacroIf,
+            #list operations
         'cons': Cons,
         'car': Car,
         'cdr': Cdr,
+            #comparisons
+        '=': Equal,
+            #macros
+        'define': Define,
+        'if': MacroIf,
         'lambda': Lambda,
     }
 

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	Tue Jul  3 17:28:13 2007
@@ -151,9 +151,30 @@
     w_cddr = eval_noctx("(cdr (cdr (cons 1 (cons 2 3))))")
     assert w_cddr.to_number() == 3
 
+def test_comparison_homonums():
+    w_bool = eval_noctx("(= 1 2)")
+    assert w_bool.to_boolean() is False
+
+    w_bool = eval_noctx("(= 2 2)")
+    assert w_bool.to_boolean() is True
+
+    w_bool = eval_noctx("(= 2.1 1.2)")
+    assert w_bool.to_boolean() is False
+
+    w_bool = eval_noctx("(= 2.1 2.1)")
+    assert w_bool.to_boolean() is True
+
+def test_comparison_heteronums():
+    w_bool = eval_noctx("(= 1 2.2)")
+    assert w_bool.to_boolean() is False
+
+    w_bool = eval_noctx("(= 2.0 2)")
+    assert w_bool.to_boolean() is True
+
 def test_lambda_noargs():
     ctx = ExecutionContext()
     w_lambda = eval_expr(ctx, "(lambda () 12)")
+    assert isinstance(w_lambda, W_Procedure)
     assert isinstance(w_lambda, W_Lambda)
 
     ctx.put("f1", w_lambda)
@@ -186,3 +207,18 @@
     assert isinstance(w_result, W_Fixnum)
     assert w_result.to_number() == 42
 
+def test_lambda_fac():
+    ctx = ExecutionContext()
+    eval_expr(ctx, """
+        (define fac
+            (lambda (n)
+                (if (= n 1)
+                    n
+                    (* (fac (- n 1)) n))))""")
+    assert isinstance(ctx.get("fac"), W_Lambda)
+    w_result = eval_expr(ctx, "(fac 4)")
+    assert w_result.to_number() == 24
+
+    w_result = eval_expr(ctx, "(fac 5)")
+    assert w_result.to_number() == 120
+



More information about the Pypy-commit mailing list