summaryrefslogtreecommitdiff
path: root/src/eval/mod.rs
diff options
context:
space:
mode:
authorLaurenz <laurmaedje@gmail.com>2021-01-26 21:13:52 +0100
committerLaurenz <laurmaedje@gmail.com>2021-01-26 21:13:52 +0100
commite8470824352064fefbb5d0d30a728211d11cea53 (patch)
tree128b49fd0609566584d1c2822db25303806e3e43 /src/eval/mod.rs
parentaaa48403cdd3d8499584eeca4103865d6425ac1b (diff)
Multi-expression blocks 🛍️
Diffstat (limited to 'src/eval/mod.rs')
-rw-r--r--src/eval/mod.rs28
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);