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

jlg at codespeak.net jlg at codespeak.net
Thu Aug 2 12:28:07 CEST 2007


Author: jlg
Date: Thu Aug  2 12:28:00 2007
New Revision: 45451

Modified:
   pypy/dist/pypy/lang/scheme/object.py
   pypy/dist/pypy/lang/scheme/test/test_macro.py
Log:
not nested ellipsis in template in glory

Modified: pypy/dist/pypy/lang/scheme/object.py
==============================================================================
--- pypy/dist/pypy/lang/scheme/object.py	(original)
+++ pypy/dist/pypy/lang/scheme/object.py	Thu Aug  2 12:28:00 2007
@@ -866,8 +866,9 @@
         self.expr = expr
 
 class EllipsisException(SchemeException):
-    def __init__(self, ellipsis):
+    def __init__(self, ellipsis, name):
         self.expr = ellipsis.expr
+        self.name = name
 
 class SyntaxRule(object):
     def __init__(self, pattern, template, literals):
@@ -1011,7 +1012,7 @@
                     return PairClosure(ctx, w_sub)
 
                 if isinstance(w_sub, Ellipsis):
-                    raise EllipsisException(w_sub)
+                    raise EllipsisException(w_sub, sexpr.name)
 
                 return w_sub
 
@@ -1023,18 +1024,23 @@
                         self.substitute(ctx, sexpr.cdr, match_dict))
             except EllipsisException, e:
                 scdr = sexpr.cdr
-                print ">", sexpr, e.expr
+                print ">", sexpr, e.name, e.expr
                 if isinstance(scdr, W_Pair) and scdr.car is w_ellipsis:
-                    return e.expr
-                else:
+                    print ">>", sexpr, e.name, e.expr
                     plst = []
                     w_pair = e.expr
                     while isinstance(w_pair, W_Pair):
-                        plst.append(W_Pair(w_pair.car, scdr))
+                        #plst.append(W_Pair(w_pair.car, scdr))
+                        zzz = self.substitute(ctx, sexpr.car,
+                                {e.name: w_pair.car})
+                        plst.append(zzz)
                         w_pair = w_pair.cdr
 
-                    ellipsis = Ellipsis(plst2lst(plst))
-                    raise EllipsisException(ellipsis)
+                    ellipsis = plst2lst(plst)
+                    print ellipsis
+                    return ellipsis
+                else:
+                    raise e #EllipsisException(ellipsis, e.name)
 
             w_paircar = w_pair.car
             if isinstance(w_paircar, W_Symbol):

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	Thu Aug  2 12:28:00 2007
@@ -318,6 +318,22 @@
                                           (set! z 1)
                                           (+ x y z))""").to_number() == 3
 
+def test_ellipsis_expr_template():
+    ctx = ExecutionContext()
+    eval_(ctx, """(define-syntax zero-if-true
+                                 (syntax-rules ()
+                                    ((_ sym ...)
+                                     (begin
+                                       (if sym (set! sym 0)) ...))))""")
+
+    eval_(ctx, "(define x #t)")
+    eval_(ctx, "(define y #f)")
+    eval_(ctx, "(define z #t)")
+    eval_(ctx, "(zero-if-true x y z)")
+    assert eval_(ctx, "x").to_number() == 0
+    assert eval_(ctx, "y").to_boolean() is False
+    assert eval_(ctx, "z").to_number() == 0
+
 def test_ellipsis_list_pattern():
     py.test.skip("in progress")
     ctx = ExecutionContext()



More information about the Pypy-commit mailing list