From ed929dd10c8cbf57bf590db8c63cd8878ce2a864 Mon Sep 17 00:00:00 2001 From: Laurenz Date: Tue, 26 Jan 2021 21:16:36 +0100 Subject: =?UTF-8?q?For=20loops=20=F0=9F=94=81?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit (does not support key-value patterns yet) --- src/eval/mod.rs | 36 ++++++++++++++++++++++++++++++++++++ 1 file changed, 36 insertions(+) (limited to 'src/eval') diff --git a/src/eval/mod.rs b/src/eval/mod.rs index eaa0b08f..27c66095 100644 --- a/src/eval/mod.rs +++ b/src/eval/mod.rs @@ -182,6 +182,7 @@ impl Eval for Spanned<&Expr> { Expr::Binary(v) => v.with_span(self.span).eval(ctx), Expr::Let(v) => v.with_span(self.span).eval(ctx), Expr::If(v) => v.with_span(self.span).eval(ctx), + Expr::For(v) => v.with_span(self.span).eval(ctx), } } } @@ -372,3 +373,38 @@ impl Eval for Spanned<&ExprIf> { Value::Error } } + +impl Eval for Spanned<&ExprFor> { + type Output = Value; + + fn eval(self, ctx: &mut EvalContext) -> Self::Output { + let iter = self.v.iter.eval(ctx); + if let Value::Array(array) = iter { + let mut output = match self.v.body.v { + Expr::Template(_) => Value::Template(vec![]), + _ => Value::None, + }; + + for value in array { + ctx.scopes.define(self.v.pat.v.as_str(), value); + let value = self.v.body.eval(ctx); + + if let Value::Template(prev) = &mut output { + if let Value::Template(new) = value { + prev.extend(new); + } + } + } + + return output; + } else if iter != Value::Error { + ctx.diag(error!( + self.v.iter.span, + "expected array, found {}", + iter.type_name(), + )); + } + + Value::Error + } +} -- cgit v1.2.3