diff options
| author | Laurenz <laurmaedje@gmail.com> | 2021-01-13 11:54:50 +0100 |
|---|---|---|
| committer | Laurenz <laurmaedje@gmail.com> | 2021-01-13 11:54:50 +0100 |
| commit | 539735e668f601058c2c71a847335e17fac107e8 (patch) | |
| tree | 32ce04a99fd92a089625e4abdc09d2373687f0ab /src/eval | |
| parent | d2ba1b705ed7a532266294aa100f19423bb07f4d (diff) | |
Basic let bindings 🎞
Diffstat (limited to 'src/eval')
| -rw-r--r-- | src/eval/mod.rs | 25 |
1 files changed, 22 insertions, 3 deletions
diff --git a/src/eval/mod.rs b/src/eval/mod.rs index 32a7d6ba..0e6fa79f 100644 --- a/src/eval/mod.rs +++ b/src/eval/mod.rs @@ -46,6 +46,17 @@ pub trait Eval { fn eval(self, ctx: &mut EvalContext) -> Self::Output; } +impl<'a, T> Eval for &'a Spanned<T> +where + Spanned<&'a T>: Eval, +{ + type Output = <Spanned<&'a T> as Eval>::Output; + + fn eval(self, ctx: &mut EvalContext) -> Self::Output { + self.as_ref().eval(ctx) + } +} + impl Eval for &[Spanned<Node>] { type Output = (); @@ -163,6 +174,14 @@ impl Eval for Spanned<&Expr> { Expr::Template(v) => Value::Template(v.clone()), Expr::Group(v) => v.as_ref().with_span(self.span).eval(ctx), Expr::Block(v) => v.as_ref().with_span(self.span).eval(ctx), + Expr::Let(v) => { + let value = match &v.expr { + Some(expr) => expr.as_ref().eval(ctx), + None => Value::None, + }; + Rc::make_mut(&mut ctx.state.scope).set(v.pat.v.as_str(), value); + Value::None + } } } } @@ -171,7 +190,7 @@ 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.as_ref().eval(ctx); if let Value::Error = value { return Value::Error; @@ -189,8 +208,8 @@ impl Eval for Spanned<&ExprBinary> { type Output = Value; fn eval(self, ctx: &mut EvalContext) -> Self::Output { - let lhs = (*self.v.lhs).as_ref().eval(ctx); - let rhs = (*self.v.rhs).as_ref().eval(ctx); + let lhs = self.v.lhs.as_ref().eval(ctx); + let rhs = self.v.rhs.as_ref().eval(ctx); if lhs == Value::Error || rhs == Value::Error { return Value::Error; |
