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

jlg at codespeak.net jlg at codespeak.net
Tue Aug 14 18:19:44 CEST 2007


Author: jlg
Date: Tue Aug 14 18:19:43 2007
New Revision: 45657

Added:
   pypy/dist/pypy/lang/scheme/r5rs_derived_expr.ss
Modified:
   pypy/dist/pypy/lang/scheme/execution.py
   pypy/dist/pypy/lang/scheme/object.py
   pypy/dist/pypy/lang/scheme/test/test_continuation.py
   pypy/dist/pypy/lang/scheme/test/test_eval.py
   pypy/dist/pypy/lang/scheme/test/test_macro.py
Log:
letrec is continuation friendly, achived in wierd way; macros ellipsis corner-case fixed, still some to be done; added r4rs_derived_expr.ss which defines syntax for (cond...), (and ...) and (or ...) using macros while ExecutionContext init

Modified: pypy/dist/pypy/lang/scheme/execution.py
==============================================================================
--- pypy/dist/pypy/lang/scheme/execution.py	(original)
+++ pypy/dist/pypy/lang/scheme/execution.py	Tue Aug 14 18:19:43 2007
@@ -1,5 +1,6 @@
 import pypy.lang.scheme.object as ssobject
-#from pypy.lang.scheme.object import *
+from pypy.lang.scheme.ssparser import parse
+import py
 
 class Location(object):
     def __init__(self, w_obj=None):
@@ -14,6 +15,10 @@
     except (TypeError, AttributeError):
         pass
 
+de_file = py.magic.autopath().dirpath().join("r5rs_derived_expr.ss")
+de_code = de_file.read()
+de_expr_lst = parse(de_code)
+
 class ExecutionContext(object):
     """Execution context implemented as a dict.
 
@@ -21,14 +26,6 @@
     """
     def __init__(self, globalscope=None, scope=None, closure=False,
             cont_stack=None):
-        if globalscope is None:
-            self.globalscope = {}
-            for name, oper in OPERATION_MAP.items():
-                self.globalscope[name] = Location(oper)
-
-        else:
-            self.globalscope = globalscope
-
         if scope is None:
             self.scope = {}
         else:
@@ -41,6 +38,17 @@
         else:
             self.cont_stack = cont_stack
 
+        if globalscope is None:
+            self.globalscope = {}
+            for name, oper in OPERATION_MAP.items():
+                self.globalscope[name] = Location(oper)
+
+            for expr in de_expr_lst:
+                expr.eval(self)
+
+        else:
+            self.globalscope = globalscope
+
     def _dispatch(self, symb):
         if isinstance(symb, ssobject.SymbolClosure):
             return (symb.closure, symb.name)

Modified: pypy/dist/pypy/lang/scheme/object.py
==============================================================================
--- pypy/dist/pypy/lang/scheme/object.py	(original)
+++ pypy/dist/pypy/lang/scheme/object.py	Tue Aug 14 18:19:43 2007
@@ -198,11 +198,9 @@
         return "()"
 
     def eval_cf(self, ctx, caller, cont, elst=[], enum=0):
-        #XXX not tests here
         raise SchemeSyntaxError
 
     def eval_tr(self, ctx):
-        #XXX not tests here
         raise SchemeSyntaxError
 
 w_nil = W_Nil()
@@ -648,6 +646,16 @@
 
         return w_promise.force(ctx)
 
+#XXX no tests in eval
+class EqP(W_Procedure):
+    _symbol_name = "eq?"
+
+    def procedure(self, ctx, lst):
+        if len(lst) != 2:
+            raise WrongArgsNumber
+
+        return W_Boolean(lst[0] is lst[1])
+
 ##
 # Predicate
 ##
@@ -728,7 +736,10 @@
 
         return w_obj.round() % 2 == 0
 
-#XXX no tests for it
+##
+# Type Pradicates
+##
+
 class PairP(W_Procedure):
     _symbol_name = "pair?"
 
@@ -736,11 +747,16 @@
         if len(lst) != 1:
             raise WrongArgsNumber
 
-        w_obj = lst[0]
-        if isinstance(w_obj, W_Pair):
-            return W_Boolean(True)
+        return W_Boolean(isinstance(lst[0], W_Pair))
+
+class ProcedureP(W_Procedure):
+    _symbol_name = "procedure?"
+
+    def procedure(self, ctx, lst):
+        if len(lst) != 1:
+            raise WrongArgsNumber
 
-        return W_Boolean(False)
+        return W_Boolean(isinstance(lst[0], W_Procedure))
 
 ##
 # Macro
@@ -896,9 +912,35 @@
 
         return body.eval_tr(local_ctx)
 
+class DictWrapper(W_Root):
+    def __init__(self, w_dict):
+        self.d = w_dict
+
 class Letrec(W_Macro):
     _symbol_name = "letrec"
 
+    def continue_tr(self, ctx, lst, elst, cnt=True):
+        ctx = ctx.copy()
+        (body, name_symb, name_val, cont_val) = elst
+        assert isinstance(name_symb, DictWrapper)
+        assert isinstance(name_val, DictWrapper)
+        assert isinstance(lst, W_Symbol)
+
+        cont_name = lst.name
+        for (name, w_val) in name_val.d.items():
+            if name == cont_name:
+                ctx.ssete(lst, cont_val)
+            else:
+                ctx.ssete(name_symb.d[name], w_val)
+
+        w_result = body.eval(ctx)
+
+        if len(ctx.cont_stack) == 0:
+            raise ContinuationReturn(w_result)
+
+        cont = ctx.cont_stack.pop()
+        return cont.run(ctx, w_result)
+
     def call_tr(self, ctx, lst):
         """let uses eval_body, so it is tail-recursive aware"""
         if not isinstance(lst, W_Pair):
@@ -907,6 +949,7 @@
         body = Body(lst.cdr)
         map_name_expr = {}
         map_name_symb = {}
+        w_name_symb = DictWrapper(map_name_symb)
         w_formal = lst.car
         while isinstance(w_formal, W_Pair):
             w_def = w_formal.get_car_as_pair()
@@ -917,8 +960,12 @@
             w_formal = w_formal.cdr
 
         map_name_val = {}
+        w_name_val = DictWrapper(map_name_val)
         for (name, expr) in map_name_expr.items():
-            map_name_val[name] = expr.eval(local_ctx)
+            #map_name_val[name] = expr.eval(local_ctx)
+            map_name_val[name] = expr.eval_cf(local_ctx, self,
+                    map_name_symb[name],
+                    [body, w_name_symb, w_name_val], 3)
 
         for (name, w_val) in map_name_val.items():
             local_ctx.ssete(map_name_symb[name], w_val)
@@ -1116,14 +1163,16 @@
         return self.matchr(ctx, self.pattern.cdr, w_expr.cdr)
 
     def matchr(self, ctx, w_patt, w_expr):
+        print "  >", w_patt.to_string(), w_expr.to_string()
         if isinstance(w_patt, W_Pair):
             w_pattcar = w_patt.car
+            w_pattcdr = w_patt.cdr
             if isinstance(w_expr, W_Pair):
                 mdict_car = self.matchr(ctx, w_pattcar, w_expr.car)
                 try:
                     #we catch EllipsisPattern here because in car
                     # we dont know how to deal with it
-                    mdict_cdr = self.matchr(ctx, w_patt.cdr, w_expr.cdr)
+                    mdict_cdr = self.matchr(ctx, w_pattcdr, w_expr.cdr)
                 except EllipsisPattern:
                     print "ellipsis matched", w_patt, w_expr
 
@@ -1144,8 +1193,19 @@
                 mdict_car.update(mdict_cdr)
                 return mdict_car
 
-            if w_pattcar is w_ellipsis and w_expr is w_nil:
-                raise EllipsisPattern
+            if w_expr is w_nil:
+                #one matched to ellipsis
+                if w_pattcar is w_ellipsis:
+                    raise EllipsisPattern
+
+                #zero matched to ellipsis
+                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 
+                        #print w_patt, "matched to ()"
+                        raise NotImplementedError
+                    return {w_pattcar.name: Ellipsis([])}
 
         if w_patt is w_ellipsis:
             raise EllipsisPattern
@@ -1224,6 +1284,7 @@
     def match(self, ctx, w_expr):
         for rule in self.syntax_lst:
             try:
+                print "m>", rule.pattern.to_string()
                 match_dict = rule.match(ctx, w_expr)
                 return (rule.template, match_dict)
             except MatchError:
@@ -1233,6 +1294,7 @@
 
     def expand(self, ctx, w_expr):
         try:
+            print w_expr.to_string()
             (template, match_dict) = self.match(ctx, w_expr)
         except MatchError:
             raise SchemeSyntaxError

Added: pypy/dist/pypy/lang/scheme/r5rs_derived_expr.ss
==============================================================================
--- (empty file)
+++ pypy/dist/pypy/lang/scheme/r5rs_derived_expr.ss	Tue Aug 14 18:19:43 2007
@@ -0,0 +1,41 @@
+(define-syntax cond
+  (syntax-rules (else =>)
+    ((cond (else result1 result2 ...))
+     (begin result1 result2 ...))
+    ((cond (test => result))
+     (let ((temp test))
+       (if temp (result temp))))
+    ((cond (test => result) clause1 clause2 ...)
+     (let ((temp test))
+       (if temp
+           (result temp)
+           (cond clause1 clause2 ...))))
+    ((cond (test)) test)
+    ((cond (test) clause1 clause2 ...)
+     (let ((temp test))
+       (if temp
+           temp
+           (cond clause1 clause2 ...))))
+    ((cond (test result1 result2 ...))
+     (if test (begin result1 result2 ...)))
+    ((cond (test result1 result2 ...)
+           clause1 clause2 ...)
+     (if test
+         (begin result1 result2 ...)
+         (cond clause1 clause2 ...)))))
+
+(define-syntax and
+  (syntax-rules ()
+    ((and) #t)
+    ((and test) test)
+    ((and test1 test2 ...)
+     (if test1 (and test2 ...) #f))))
+
+(define-syntax or
+  (syntax-rules ()
+    ((or) #f)
+    ((or test) test)
+    ((or test1 test2 ...)
+     (let ((x test1))
+       (if x x (or test2 ...))))))
+

Modified: pypy/dist/pypy/lang/scheme/test/test_continuation.py
==============================================================================
--- pypy/dist/pypy/lang/scheme/test/test_continuation.py	(original)
+++ pypy/dist/pypy/lang/scheme/test/test_continuation.py	Tue Aug 14 18:19:43 2007
@@ -211,7 +211,6 @@
     assert w_result.to_number() == 10
 
 def test_pitfall_1_1():
-    py.test.skip("letrec not cf")
     ctx = ExecutionContext()
     w_result = eval_(ctx, """
         (let ((cont #f))
@@ -228,20 +227,20 @@
     assert w_result.to_number() == 1
 
 def test_pitfall_1_2():
-    py.test.skip("(cond ...) and (procedure? ...) not implemented")
+    #py.test.skip("(cond ...), (and ...) not implemented")
     ctx = ExecutionContext()
+
     w_result = eval_(ctx, """
       (letrec ((x (call/cc list)) (y (call/cc list)))
         (cond ((procedure? x) (x (pair? y)))
-          ((procedure? y) (y (pair? x))))
+              ((procedure? y) (y (pair? x))))
         (let ((x (car x)) (y (car y)))
-          (and (call/cc x) (call/cc y) (call/cc x)))))""")
+          (and (call/cc x) (call/cc y) (call/cc x))))""")
 
     assert isinstance(w_result, W_Boolean)
     assert w_result.to_boolean() is True
 
 def test_pitfall_1_3():
-    py.test.skip("(eq? ...) not implemented, letrec not cf")
     ctx = ExecutionContext()
     w_result = eval_(ctx, """
       (letrec ((x (call/cc

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 Aug 14 18:19:43 2007
@@ -8,7 +8,7 @@
                    W_Pair(W_Integer(4), W_Pair(W_Integer(5), w_nil)))
     assert w_num.eval(ExecutionContext()).to_number() == 9 
 
-def eval_expr(ctx, expr):
+def eval_(ctx, expr):
     return parse(expr)[0].eval(ctx)
 
 def eval_noctx(expr):
@@ -67,73 +67,73 @@
     ctx.put("v1", W_Integer(4))
     ctx.put("v2", W_Integer(5))
 
-    w_num = eval_expr(ctx, "(+ 1 v1 v2)")
+    w_num = eval_(ctx, "(+ 1 v1 v2)")
     assert w_num.to_number() == 10
 
     ctx.put("v2", W_Real(3.2))
-    w_num = eval_expr(ctx, "(+ 1 v1 v2)")
+    w_num = eval_(ctx, "(+ 1 v1 v2)")
     assert w_num.to_number() == 8.2
 
 def test_ctx_define():
     ctx = ExecutionContext()
-    eval_expr(ctx, "(define v1 42)")
+    eval_(ctx, "(define v1 42)")
     assert ctx.get("v1").to_number() == 42
-    w_num = eval_expr(ctx, "v1")
+    w_num = eval_(ctx, "v1")
     assert w_num.to_number() == 42
 
-    eval_expr(ctx, "(define v2 2.1)")
+    eval_(ctx, "(define v2 2.1)")
     assert ctx.get("v2").to_number() == 2.1
 
-    w_num = eval_expr(ctx, "(+ 1 v1 v2)")
+    w_num = eval_(ctx, "(+ 1 v1 v2)")
     assert w_num.to_number() == 45.1
 
-    eval_expr(ctx, "(define v2 3.1)")
-    w_num = eval_expr(ctx, "(+ 1 v1 v2)")
+    eval_(ctx, "(define v2 3.1)")
+    w_num = eval_(ctx, "(+ 1 v1 v2)")
     assert w_num.to_number() == 46.1
 
 def text_unbound():
     ctx = ExecutionContext()
-    py.test.raises(UnboundVariable, eval_expr, ctx, "y")
+    py.test.raises(UnboundVariable, eval_, ctx, "y")
 
 def test_sete():
     ctx = ExecutionContext()
-    eval_expr(ctx, "(define x 42)")
+    eval_(ctx, "(define x 42)")
     loc1 = ctx.get_location("x")
-    eval_expr(ctx, "(set! x 43)")
+    eval_(ctx, "(set! x 43)")
     loc2 = ctx.get_location("x")
     assert ctx.get("x").to_number() == 43
     assert loc1 is loc2
-    py.test.raises(UnboundVariable, eval_expr, ctx, "(set! y 42)")
+    py.test.raises(UnboundVariable, eval_, ctx, "(set! y 42)")
 
 def test_func():
     ctx = ExecutionContext()
-    w_func = eval_expr(ctx, "+")
+    w_func = eval_(ctx, "+")
     assert isinstance(w_func, W_Procedure)
 
 def test_if_simple():
     ctx = ExecutionContext()
-    w_t = eval_expr(ctx, "(if #t #t #f)")
+    w_t = eval_(ctx, "(if #t #t #f)")
     assert w_t.to_boolean() is True
-    w_f = eval_expr(ctx, "(if #f #t #f)")
+    w_f = eval_(ctx, "(if #f #t #f)")
     assert w_f.to_boolean() is False
-    w_f = eval_expr(ctx, "(if 1 #f #t)")
+    w_f = eval_(ctx, "(if 1 #f #t)")
     assert w_f.to_boolean() is False
-    w_f = eval_expr(ctx, "(if #t #t)")
+    w_f = eval_(ctx, "(if #t #t)")
     assert w_f.to_boolean() is True
-    w_f = eval_expr(ctx, "(if #f #t)")
+    w_f = eval_(ctx, "(if #f #t)")
     assert w_f.to_boolean() is False
 
 def test_if_evaluation():
     ctx = ExecutionContext()
-    eval_expr(ctx, "(define then #f)")
-    eval_expr(ctx, "(define else #f)")
-    eval_expr(ctx, "(if #t (define then #t) (define else #t))")
+    eval_(ctx, "(define then #f)")
+    eval_(ctx, "(define else #f)")
+    eval_(ctx, "(if #t (define then #t) (define else #t))")
     assert ctx.get("then").to_boolean() is True
     assert ctx.get("else").to_boolean() is False
 
-    eval_expr(ctx, "(define then #f)")
-    eval_expr(ctx, "(define else #f)")
-    eval_expr(ctx, "(if #f (define then #t) (define else #t))")
+    eval_(ctx, "(define then #f)")
+    eval_(ctx, "(define else #f)")
+    eval_(ctx, "(if #f (define then #t) (define else #t))")
     assert ctx.get("then").to_boolean() is False
     assert ctx.get("else").to_boolean() is True
 
@@ -205,81 +205,81 @@
 
 def test_lambda_noargs():
     ctx = ExecutionContext()
-    w_lambda = eval_expr(ctx, "(lambda () 12)")
+    w_lambda = eval_(ctx, "(lambda () 12)")
     assert isinstance(w_lambda, W_Procedure)
     assert isinstance(w_lambda, W_Lambda)
 
     ctx.put("f1", w_lambda)
-    w_result = eval_expr(ctx, "(f1)")
+    w_result = eval_(ctx, "(f1)")
     assert isinstance(w_result, W_Integer)
     assert w_result.to_number() == 12
 
 def test_lambda_args():
     ctx = ExecutionContext()
-    w_lam = eval_expr(ctx, "(define f1 (lambda (n) n))")
+    w_lam = eval_(ctx, "(define f1 (lambda (n) n))")
     assert isinstance(w_lam, W_Lambda)
 
-    w_result = eval_expr(ctx, "(f1 42)")
+    w_result = eval_(ctx, "(f1 42)")
     assert isinstance(w_result, W_Integer)
     assert w_result.to_number() == 42
 
-    w_result = eval_expr(ctx, "((lambda (n m) (+ n m)) 42 -42)")
+    w_result = eval_(ctx, "((lambda (n m) (+ n m)) 42 -42)")
     assert isinstance(w_result, W_Integer)
     assert w_result.to_number() == 0
 
 def test_lambda_top_ctx():
     ctx = ExecutionContext()
-    eval_expr(ctx, "(define n 42)")
-    eval_expr(ctx, "(define f1 (lambda (m) (+ n m)))")
-    w_result = eval_expr(ctx, "(f1 -42)")
+    eval_(ctx, "(define n 42)")
+    eval_(ctx, "(define f1 (lambda (m) (+ n m)))")
+    w_result = eval_(ctx, "(f1 -42)")
     assert isinstance(w_result, W_Integer)
     assert w_result.to_number() == 0
 
-    eval_expr(ctx, "(define n 84)")
-    w_result = eval_expr(ctx, "(f1 -42)")
+    eval_(ctx, "(define n 84)")
+    w_result = eval_(ctx, "(f1 -42)")
     assert isinstance(w_result, W_Integer)
     assert w_result.to_number() == 42
 
 def test_lambda_fac():
     ctx = ExecutionContext()
-    eval_expr(ctx, """
+    eval_(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)")
+    w_result = eval_(ctx, "(fac 4)")
     assert w_result.to_number() == 24
 
-    w_result = eval_expr(ctx, "(fac 5)")
+    w_result = eval_(ctx, "(fac 5)")
     assert w_result.to_number() == 120
 
 def test_lambda2():
     ctx = ExecutionContext()
-    eval_expr(ctx, """(define adder (lambda (x) (lambda (y) (+ x y))))""")
-    w_lambda = eval_expr(ctx, "(adder 6)")
+    eval_(ctx, """(define adder (lambda (x) (lambda (y) (+ x y))))""")
+    w_lambda = eval_(ctx, "(adder 6)")
     assert isinstance(w_lambda, W_Lambda)
 
-    eval_expr(ctx, """(define add6 (adder 6))""")
-    w_result = eval_expr(ctx, "(add6 5)")
+    eval_(ctx, """(define add6 (adder 6))""")
+    w_result = eval_(ctx, "(add6 5)")
     assert isinstance(w_result, W_Integer)
     assert w_result.to_number() == 11
 
-    w_result = eval_expr(ctx, "((adder 6) 5)")
+    w_result = eval_(ctx, "((adder 6) 5)")
     assert isinstance(w_result, W_Integer)
     assert w_result.to_number() == 11
 
 def test_lambda_long_body():
     ctx = ExecutionContext()
-    eval_expr(ctx, """(define long_body (lambda () (define x 42) (+ x 1)))""")
-    w_result = eval_expr(ctx, "(long_body)")
+    eval_(ctx, """(define long_body (lambda () (define x 42) (+ x 1)))""")
+    w_result = eval_(ctx, "(long_body)")
     assert w_result.to_number() == 43
     py.test.raises(UnboundVariable, ctx.get, "x")
 
 def test_lambda_lstarg():
     ctx = ExecutionContext()
-    w_result = eval_expr(ctx, """((lambda x x) 1 2 3)""")
+    w_result = eval_(ctx, """((lambda x x) 1 2 3)""")
     assert isinstance(w_result, W_Pair)
     assert w_result.car.to_number() == 1
     assert w_result.cdr.car.to_number() == 2
@@ -287,10 +287,10 @@
 
 def test_lambda_dotted_lstarg():
     ctx = ExecutionContext()
-    w_result = eval_expr(ctx, """((lambda (x y . z) z) 3 4)""")
+    w_result = eval_(ctx, """((lambda (x y . z) z) 3 4)""")
     assert w_result is w_nil
 
-    w_result = eval_expr(ctx, """((lambda (x y . z) z) 3 4 5 6)""")
+    w_result = eval_(ctx, """((lambda (x y . z) z) 3 4 5 6)""")
     assert isinstance(w_result, W_Pair)
     assert w_result.car.to_number() == 5
     assert w_result.cdr.car.to_number() == 6
@@ -298,24 +298,24 @@
 
 def test_define_lambda_sugar():
     ctx = ExecutionContext()
-    eval_expr(ctx, """(define (f x) (+ x 1))""")
-    w_result = eval_expr(ctx, "(f 1)")
+    eval_(ctx, """(define (f x) (+ x 1))""")
+    w_result = eval_(ctx, "(f 1)")
     assert isinstance(w_result, W_Integer)
     assert w_result.to_number() == 2
 
-    eval_expr(ctx, """(define (f2) (+ 1 1))""")
-    w_result = eval_expr(ctx, "(f2)")
+    eval_(ctx, """(define (f2) (+ 1 1))""")
+    w_result = eval_(ctx, "(f2)")
     assert isinstance(w_result, W_Integer)
     assert w_result.to_number() == 2
 
-    eval_expr(ctx, """(define (f3 . x) x)""")
-    w_result = eval_expr(ctx, "(f3 1 2)")
+    eval_(ctx, """(define (f3 . x) x)""")
+    w_result = eval_(ctx, "(f3 1 2)")
     assert isinstance(w_result, W_Pair)
     assert w_result.car.to_number() == 1
     assert w_result.cdr.car.to_number() == 2
 
-    eval_expr(ctx, """(define (f4 x . y) x y)""")
-    w_result = eval_expr(ctx, "(f4 1 2)")
+    eval_(ctx, """(define (f4 x . y) x y)""")
+    w_result = eval_(ctx, "(f4 1 2)")
     assert isinstance(w_result, W_Pair)
     assert w_result.car.to_number() == 2
     assert w_result.cdr is w_nil
@@ -379,7 +379,7 @@
 def test_list():
     ctx = ExecutionContext()
     ctx.put("var", W_Integer(42))
-    w_lst = eval_expr(ctx, "(list 1 var (+ 2 1) 'a)")
+    w_lst = eval_(ctx, "(list 1 var (+ 2 1) 'a)")
     assert isinstance(w_lst, W_Pair)
     assert w_lst.car.to_number() == 1
     assert w_lst.cdr.car.to_number() == 42
@@ -391,7 +391,7 @@
     ctx = ExecutionContext()
     w_global = W_Integer(0)
     ctx.put("var", w_global)
-    w_result = eval_expr(ctx, "(begin (set! var 11) (+ var 33))")
+    w_result = eval_(ctx, "(begin (set! var 11) (+ var 33))")
     assert w_result.to_number() == 44
     assert ctx.get("var").to_number() == 11
 
@@ -399,11 +399,11 @@
     ctx = ExecutionContext()
     w_global = W_Integer(0)
     ctx.put("var", w_global)
-    w_result = eval_expr(ctx, "(let ((var 42) (x (+ 2 var))) (+ var x))")
+    w_result = eval_(ctx, "(let ((var 42) (x (+ 2 var))) (+ var x))")
     assert w_result.to_number() == 44
     assert ctx.get("var") is w_global
 
-    w_result = eval_expr(ctx, """
+    w_result = eval_(ctx, """
         (let ((x (lambda () 1)))
             (let ((y (lambda () (x)))
                   (x (lambda () 2))) (y)))""")
@@ -413,7 +413,7 @@
 
 def test_letrec():
     ctx = ExecutionContext()
-    w_result = eval_expr(ctx, """
+    w_result = eval_(ctx, """
         (letrec ((even?
                     (lambda (n)
                         (if (= n 0)
@@ -427,7 +427,7 @@
                 (even? 2000))""")
     assert w_result.to_boolean() is True
 
-    w_result = eval_expr(ctx, """
+    w_result = eval_(ctx, """
         (let ((x (lambda () 1)))
             (letrec ((y (lambda () (x)))
                      (x (lambda () 2))) (y)))""")
@@ -493,40 +493,40 @@
 
 def test_delay_promise_force():
     ctx = ExecutionContext()
-    w_promise = eval_expr(ctx, "(delay (+ 1 2))")
+    w_promise = eval_(ctx, "(delay (+ 1 2))")
     assert isinstance(w_promise, W_Promise)
     ctx.put("d", w_promise)
-    w_promise2 = eval_expr(ctx, "d")
+    w_promise2 = eval_(ctx, "d")
     assert w_promise2 is w_promise
-    py.test.raises(NotCallable, eval_expr, ctx, "(d)")
+    py.test.raises(NotCallable, eval_, ctx, "(d)")
 
-    w_value = eval_expr(ctx, "(force d)")
+    w_value = eval_(ctx, "(force d)")
     assert w_value.to_number() == 3
     py.test.raises(WrongArgType, eval_noctx, "(force 'a)")
 
-    eval_expr(ctx, "(define d2 (delay (+ 1 x)))")
-    eval_expr(ctx, "(define x 42)")
-    w_result = eval_expr(ctx, "(force d2)")
+    eval_(ctx, "(define d2 (delay (+ 1 x)))")
+    eval_(ctx, "(define x 42)")
+    w_result = eval_(ctx, "(force d2)")
     assert w_result.to_number() == 43
-    eval_expr(ctx, "(set! x 0)")
-    w_result = eval_expr(ctx, "(force d2)")
+    eval_(ctx, "(set! x 0)")
+    w_result = eval_(ctx, "(force d2)")
     assert w_result.to_number() == 43
 
 def test_lambda_context():
     ctx = ExecutionContext()
-    eval_expr(ctx, """
+    eval_(ctx, """
             (define b (lambda ()
                         (define lam (lambda () (set! a 42)))
                         (define a 12)
                         (lam)
                         a))
                         """)
-    w_num = eval_expr(ctx, "(b)")
+    w_num = eval_(ctx, "(b)")
     assert w_num.to_number() == 42
 
 def test_evaluator():
     ctx = ExecutionContext()
-    eval_expr(ctx, "(define a 0)")
+    eval_(ctx, "(define a 0)")
     w_obj = parse("(let () (set! a 42) a)")[0]
     (w_expr, new_ctx) = w_obj.eval_tr(ctx)
     assert ctx.get("a").to_number() == 42
@@ -540,43 +540,43 @@
 
 def test_deep_recursion():
     ctx = ExecutionContext()
-    eval_expr(ctx, "(define a 0)")
-    eval_expr(ctx, """
+    eval_(ctx, "(define a 0)")
+    eval_(ctx, """
         (define loop (lambda (n)
                         (set! a (+ a 1))
                         (if (= n 0)
                             n
                             (loop (- n 1)))))""")
 
-    eval_expr(ctx, "(loop 2000)")
+    eval_(ctx, "(loop 2000)")
     assert ctx.get("a").to_number() == 2001
 
 def test_setcar():
     ctx = ExecutionContext()
-    w_pair = eval_expr(ctx, "(define lst '(1 2 3 4))")
-    eval_expr(ctx, "(set-car! lst 11)")
-    assert w_pair is eval_expr(ctx, "lst")
-    assert eval_expr(ctx, "(car lst)").to_number() == 11
+    w_pair = eval_(ctx, "(define lst '(1 2 3 4))")
+    eval_(ctx, "(set-car! lst 11)")
+    assert w_pair is eval_(ctx, "lst")
+    assert eval_(ctx, "(car lst)").to_number() == 11
 
-    eval_expr(ctx, "(set-car! (cdr lst) 12)")
-    assert eval_expr(ctx, "(car (cdr lst))").to_number() == 12
+    eval_(ctx, "(set-car! (cdr lst) 12)")
+    assert eval_(ctx, "(car (cdr lst))").to_number() == 12
 
 def test_setcdr():
     ctx = ExecutionContext()
-    w_pair = eval_expr(ctx, "(define lst '(1 2 3 4))")
-    eval_expr(ctx, "(set-cdr! lst (cdr (cdr lst)))")
-    w_lst = eval_expr(ctx, "lst")
+    w_pair = eval_(ctx, "(define lst '(1 2 3 4))")
+    eval_(ctx, "(set-cdr! lst (cdr (cdr lst)))")
+    w_lst = eval_(ctx, "lst")
     assert w_pair is w_lst
     assert w_lst.to_string() == "(1 3 4)"
 
-    eval_expr(ctx, "(set-cdr! (cdr lst) '(12))")
-    w_lst = eval_expr(ctx, "lst")
+    eval_(ctx, "(set-cdr! (cdr lst) '(12))")
+    w_lst = eval_(ctx, "lst")
     assert w_lst.to_string() == "(1 3 12)"
 
     #warning circural list
-    eval_expr(ctx, "(set-cdr! (cdr (cdr lst)) lst)")
-    w_lst = eval_expr(ctx, "lst")
-    assert w_lst is eval_expr(ctx, "(cdr (cdr (cdr lst)))")
+    eval_(ctx, "(set-cdr! (cdr (cdr lst)) lst)")
+    w_lst = eval_(ctx, "lst")
+    assert w_lst is eval_(ctx, "(cdr (cdr (cdr lst)))")
 
 def test_quasiquote():
     w_res = eval_noctx("(quasiquote (list (unquote (+ 1 2)) 4))")
@@ -632,3 +632,30 @@
     assert w_res.to_string() == \
         "(1 (quasiquote (2 (unquote-splicing (list 3 4 5 6 7)))))"
 
+def test_nil_eval():
+    ctx = ExecutionContext()
+    py.test.raises(SchemeSyntaxError, eval_, ctx, "()")
+
+def test_type_predicates():
+    ctx = ExecutionContext()
+
+    assert eval_(ctx, "(pair? 1)").to_boolean() is False
+    assert eval_(ctx, "(pair? '())").to_boolean() is False
+    assert eval_(ctx, "(pair? +)").to_boolean() is False
+    assert eval_(ctx, "(pair? (lambda () 1))").to_boolean() is False
+    assert eval_(ctx, "(pair? '(1))").to_boolean() is True
+    assert eval_(ctx, "(pair? (list 1))").to_boolean() is True
+    assert eval_(ctx, "(pair? (cons 1 2))").to_boolean() is True
+
+    assert eval_(ctx, "(procedure? 1)").to_boolean() is False
+    assert eval_(ctx, "(procedure? '())").to_boolean() is False
+    assert eval_(ctx, "(procedure? '(1))").to_boolean() is False
+    assert eval_(ctx, "(procedure? (list 1))").to_boolean() is False
+    assert eval_(ctx, "(procedure? (cons 1 2))").to_boolean() is False
+    assert eval_(ctx, "(procedure? +)").to_boolean() is True
+    assert eval_(ctx, "(procedure? (lambda () 1))").to_boolean() is True
+
+def test_eq():
+    #XXX must be added soon!
+    py.test.skip("to lazy to write it now")
+

Modified: pypy/dist/pypy/lang/scheme/test/test_macro.py
==============================================================================
--- pypy/dist/pypy/lang/scheme/test/test_macro.py	(original)
+++ pypy/dist/pypy/lang/scheme/test/test_macro.py	Tue Aug 14 18:19:43 2007
@@ -464,9 +464,10 @@
     assert w_result.to_number() == 4
 
 def test_pitfall_3_2():
-    py.test.skip("(cond ...) not implemented yet")
+    ctx = ExecutionContext()
+
     #define inside macors can and sometimes can not introduce new binding
-    w_result = eval_noctx("""(let-syntax ((foo (syntax-rules ()
+    w_result = eval_(ctx, """(let-syntax ((foo (syntax-rules ()
                                                  ((_ var) (define var 1)))))
                                  (let ((x 2))
                                    (begin (define foo +))



More information about the Pypy-commit mailing list