44Experimental, not for use in production code.
55"""
66
7- from ast import Name , Call , Tuple , Load
7+ from ast import Name , Call , Tuple , Load , Subscript , Index
88
99from macropy .core .quotes import macros , q , u , ast_literal
1010from macropy .core .walkers import Walker
@@ -16,7 +16,34 @@ def prefix(block_body):
1616 isunquote = lambda tree : type (tree ) is Name and tree .id == "u"
1717 iskwargs = lambda tree : type (tree ) is Call and type (tree .func ) is Name and tree .func .id == "kw"
1818 @Walker
19- def transform (tree , * , quotelevel , set_ctx , ** kw ):
19+ def transform (tree , * , quotelevel , set_ctx , stop , ** kw ):
20+ # Not tuples but syntax: leave alone the:
21+ # - bindings blocks of let, letseq, letrec, and the d*, b* variants
22+ # - subscript part of an explicit do[]
23+ # but recurse inside them.
24+ #
25+ # let and do have not expanded yet when prefix runs (better that way!),
26+ # so we can't use the (expanded-form) detectors islet, isdo.
27+ if type (tree ) is Call and type (tree .func ) is Name and \
28+ any (tree .func .id == x for x in ("let" , "letseq" , "letrec" ,
29+ "dlet" , "dletseq" , "dletrec" ,
30+ "blet" , "bletseq" , "bletrec" )):
31+ # let((x, 42))[...] appears as Subscript(value=Call(...), ...)
32+ stop ()
33+ for binding in tree .args : # TODO: kwargs support for let(x=42)[...] if implemented later
34+ _ , value = binding .elts # leave name alone, recurse into value
35+ binding .elts [1 ] = transform .recurse (value , quotelevel = quotelevel )
36+ return tree
37+ elif type (tree ) is Subscript and type (tree .value ) is Name and \
38+ any (tree .value .id == x for x in ("do" , "do0" )) and \
39+ type (tree .slice ) is Index and type (tree .slice .value ) is Tuple :
40+ stop ()
41+ newelts = []
42+ for expr in tree .slice .value .elts :
43+ newelts .append (transform .recurse (expr , quotelevel = quotelevel ))
44+ tree .slice .value .elts = newelts
45+ return tree
46+ # general case
2047 if not (type (tree ) is Tuple and type (tree .ctx ) is Load ):
2148 return tree
2249 op , * data = tree .elts
0 commit comments