[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