diff options
| author | Laurenz <laurmaedje@gmail.com> | 2021-01-26 21:13:52 +0100 |
|---|---|---|
| committer | Laurenz <laurmaedje@gmail.com> | 2021-01-26 21:13:52 +0100 |
| commit | e8470824352064fefbb5d0d30a728211d11cea53 (patch) | |
| tree | 128b49fd0609566584d1c2822db25303806e3e43 /src/eval/mod.rs | |
| parent | aaa48403cdd3d8499584eeca4103865d6425ac1b (diff) | |
Multi-expression blocks 🛍️
Diffstat (limited to 'src/eval/mod.rs')
| -rw-r--r-- | src/eval/mod.rs | 28 |
1 files changed, 20 insertions, 8 deletions
diff --git a/src/eval/mod.rs b/src/eval/mod.rs index 8563520e..eaa0b08f 100644 --- a/src/eval/mod.rs +++ b/src/eval/mod.rs @@ -68,7 +68,7 @@ impl Eval for &[Spanned<Node>] { fn eval(self, ctx: &mut EvalContext) -> Self::Output { for node in self { - node.as_ref().eval(ctx); + node.eval(ctx); } } } @@ -175,8 +175,8 @@ impl Eval for Spanned<&Expr> { Expr::Array(v) => Value::Array(v.with_span(self.span).eval(ctx)), Expr::Dict(v) => Value::Dict(v.with_span(self.span).eval(ctx)), Expr::Template(v) => Value::Template(v.clone()), - Expr::Group(v) => v.as_ref().eval(ctx), - Expr::Block(v) => v.as_ref().eval(ctx), + Expr::Group(v) => v.eval(ctx), + Expr::Block(v) => v.with_span(self.span).eval(ctx), Expr::Call(v) => v.with_span(self.span).eval(ctx), Expr::Unary(v) => v.with_span(self.span).eval(ctx), Expr::Binary(v) => v.with_span(self.span).eval(ctx), @@ -190,7 +190,7 @@ impl Eval for Spanned<&ExprArray> { type Output = ValueArray; fn eval(self, ctx: &mut EvalContext) -> Self::Output { - self.v.iter().map(|expr| expr.as_ref().eval(ctx)).collect() + self.v.iter().map(|expr| expr.eval(ctx)).collect() } } @@ -200,16 +200,28 @@ impl Eval for Spanned<&ExprDict> { fn eval(self, ctx: &mut EvalContext) -> Self::Output { self.v .iter() - .map(|Named { name, expr }| (name.v.0.clone(), expr.as_ref().eval(ctx))) + .map(|Named { name, expr }| (name.v.0.clone(), expr.eval(ctx))) .collect() } } +impl Eval for Spanned<&ExprBlock> { + type Output = Value; + + fn eval(self, ctx: &mut EvalContext) -> Self::Output { + let mut output = Value::None; + for expr in &self.v.exprs { + output = expr.eval(ctx); + } + output + } +} + impl Eval for Spanned<&ExprUnary> { type Output = Value; fn eval(self, ctx: &mut EvalContext) -> Self::Output { - let value = self.v.expr.as_ref().eval(ctx); + let value = self.v.expr.eval(ctx); if value == Value::Error { return Value::Error; } @@ -327,8 +339,8 @@ impl Eval for Spanned<&ExprLet> { type Output = Value; fn eval(self, ctx: &mut EvalContext) -> Self::Output { - let value = match &self.v.expr { - Some(expr) => expr.as_ref().eval(ctx), + let value = match &self.v.init { + Some(expr) => expr.eval(ctx), None => Value::None, }; ctx.scopes.define(self.v.pat.v.as_str(), value); |
