|
10 | 10 |
|
11 | 11 | from mcpyrate import gensym |
12 | 12 | from mcpyrate.expander import MacroExpander |
| 13 | +from mcpyrate.quotes import is_captured_value |
13 | 14 | from mcpyrate.splicing import splice_expression |
14 | 15 | from mcpyrate.utils import extract_bindings |
15 | 16 | from mcpyrate.walkers import ASTTransformer |
|
28 | 29 | def multilambda(block_body): |
29 | 30 | class MultilambdaTransformer(ASTTransformer): |
30 | 31 | def transform(self, tree): |
31 | | - if type(tree) is not Lambda or type(tree.body) is not List: |
| 32 | + if is_captured_value(tree): |
| 33 | + return tree # don't recurse! |
| 34 | + if not (type(tree) is Lambda and type(tree.body) is List): |
32 | 35 | return self.generic_visit(tree) |
33 | 36 | bodys = tree.body |
34 | 37 | # bracket magic: |
@@ -96,6 +99,8 @@ def nameit(myname, tree): |
96 | 99 |
|
97 | 100 | class NamedLambdaTransformer(ASTTransformer): |
98 | 101 | def transform(self, tree): |
| 102 | + if is_captured_value(tree): |
| 103 | + return tree # don't recurse! |
99 | 104 | if islet(tree, expanded=False): # let bindings |
100 | 105 | view = UnexpandedLetView(tree) |
101 | 106 | for b in view.bindings: |
@@ -185,6 +190,8 @@ def f(tree): |
185 | 190 |
|
186 | 191 | class UnderscoreTransformer(ASTTransformer): |
187 | 192 | def transform(self, tree): |
| 193 | + if is_captured_value(tree): |
| 194 | + return tree # don't recurse! |
188 | 195 | # Don't recurse into nested `f[]`. |
189 | 196 | # TODO: This would benefit from macro destructuring in the expander. |
190 | 197 | # TODO: See https://github.com/Technologicat/mcpyrate/issues/3 |
@@ -239,6 +246,9 @@ def isfunctionoruserlambda(tree): |
239 | 246 |
|
240 | 247 | class EnvifyTransformer(ASTTransformer): |
241 | 248 | def transform(self, tree): |
| 249 | + if is_captured_value(tree): |
| 250 | + return tree # don't recurse! |
| 251 | + |
242 | 252 | bindings = self.state.bindings |
243 | 253 | enames = self.state.enames |
244 | 254 |
|
|
0 commit comments