diff options
| author | Laurenz <laurmaedje@gmail.com> | 2021-07-10 23:00:03 +0200 |
|---|---|---|
| committer | Laurenz <laurmaedje@gmail.com> | 2021-07-11 13:20:53 +0200 |
| commit | 9fe9b95b7f257100b9242913ae079752b232bb87 (patch) | |
| tree | c68a2b93b45e9bed5e1706da76a82a5c3f8ddd16 /src/eval/mod.rs | |
| parent | 891e0c5fa6cd9200c24011c33b6f2115d84d4d74 (diff) | |
Simpler casting
Diffstat (limited to 'src/eval/mod.rs')
| -rw-r--r-- | src/eval/mod.rs | 29 |
1 files changed, 18 insertions, 11 deletions
diff --git a/src/eval/mod.rs b/src/eval/mod.rs index fd4417ec..ed8a81c8 100644 --- a/src/eval/mod.rs +++ b/src/eval/mod.rs @@ -195,18 +195,25 @@ impl<'a> EvalContext<'a> { } match T::cast(value) { - Ok(t) => Some(t), - Err(value) => { - self.diag(error!( - span, - "expected {}, found {}", - T::TYPE_NAME, - value.type_name(), - )); + Ok(value) => Some(value), + Err(msg) => { + self.diag(error!(span, "{}", msg)); None } } } + + /// Join with another value. + pub fn join(&mut self, lhs: Value, rhs: Value, span: Span) -> Value { + let (a, b) = (lhs.type_name(), rhs.type_name()); + match ops::join(lhs, rhs) { + Ok(joined) => joined, + Err(prev) => { + self.diag(error!(span, "cannot join {} with {}", a, b)); + prev + } + } + } } /// Evaluate an expression. @@ -328,7 +335,7 @@ impl Eval for BlockExpr { let mut output = Value::None; for expr in &self.exprs { let value = expr.eval(ctx); - output = output.join(ctx, value, expr.span()); + output = ctx.join(output, value, expr.span()); } if self.scoping { @@ -627,7 +634,7 @@ impl Eval for WhileExpr { if let Some(condition) = ctx.cast(condition, self.condition.span()) { if condition { let value = self.body.eval(ctx); - output = output.join(ctx, value, self.body.span()); + output = ctx.join(output, value, self.body.span()); } else { return output; } @@ -652,7 +659,7 @@ impl Eval for ForExpr { $(ctx.scopes.def_mut($binding.as_str(), $value);)* let value = self.body.eval(ctx); - output = output.join(ctx, value, self.body.span()); + output = ctx.join(output, value, self.body.span()); } ctx.scopes.exit(); |
