diff options
Diffstat (limited to 'src/eval/mod.rs')
| -rw-r--r-- | src/eval/mod.rs | 25 |
1 files changed, 21 insertions, 4 deletions
diff --git a/src/eval/mod.rs b/src/eval/mod.rs index d9651cce..7e0d3b15 100644 --- a/src/eval/mod.rs +++ b/src/eval/mod.rs @@ -624,13 +624,30 @@ impl Eval for ShowExpr { type Output = StyleMap; fn eval(&self, ctx: &mut Context, scp: &mut Scopes) -> EvalResult<Self::Output> { + // Evaluate the target function. let target = self.target(); let target_span = target.span(); let target = target.eval(ctx, scp)?.cast::<Func>().at(target_span)?; - let recipe = self.recipe(); - let recipe_span = recipe.span(); - let recipe = recipe.eval(ctx, scp)?.cast::<Func>().at(recipe_span)?; - Ok(target.show(recipe, recipe_span).at(target_span)?) + + // Collect captured variables. + let captured = { + let mut visitor = CapturesVisitor::new(scp); + visitor.visit(self.as_red()); + visitor.finish() + }; + + // Define the recipe function. + let body = self.body(); + let body_span = body.span(); + let recipe = Func::from_closure(Closure { + name: None, + captured, + params: vec![(self.binding().take(), None)], + sink: None, + body, + }); + + Ok(target.show(recipe, body_span).at(target_span)?) } } |
