diff options
Diffstat (limited to 'src/eval')
| -rw-r--r-- | src/eval/mod.rs | 28 | ||||
| -rw-r--r-- | src/eval/ops.rs | 3 |
2 files changed, 23 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); diff --git a/src/eval/ops.rs b/src/eval/ops.rs index 939445f0..56d6687b 100644 --- a/src/eval/ops.rs +++ b/src/eval/ops.rs @@ -109,10 +109,13 @@ pub fn div(lhs: Value, rhs: Value) -> Value { (Float(a), Float(b)) => Float(a / b), (Length(a), Int(b)) => Length(a / b as f64), (Length(a), Float(b)) => Length(a / b), + (Length(a), Length(b)) => Float(a / b), (Angle(a), Int(b)) => Angle(a / b as f64), (Angle(a), Float(b)) => Angle(a / b), + (Angle(a), Angle(b)) => Float(a / b), (Relative(a), Int(b)) => Relative(a / b as f64), (Relative(a), Float(b)) => Relative(a / b), + (Relative(a), Relative(b)) => Float(a / b), (Linear(a), Int(b)) => Linear(a / b as f64), (Linear(a), Float(b)) => Linear(a / b), _ => Error, |
