[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