summaryrefslogtreecommitdiff
path: root/src/eval
diff options
context:
space:
mode:
Diffstat (limited to 'src/eval')
-rw-r--r--src/eval/mod.rs28
-rw-r--r--src/eval/ops.rs3
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,