summaryrefslogtreecommitdiff
path: root/src/eval/mod.rs
diff options
context:
space:
mode:
Diffstat (limited to 'src/eval/mod.rs')
-rw-r--r--src/eval/mod.rs25
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)?)
}
}