diff options
| author | Laurenz <laurmaedje@gmail.com> | 2021-01-22 17:16:42 +0100 |
|---|---|---|
| committer | Laurenz <laurmaedje@gmail.com> | 2021-01-22 17:16:42 +0100 |
| commit | ac788f2082711161ec8208eede04d9a2bae02241 (patch) | |
| tree | b139e41d327af906163c0b177d402b855c04507e /src/eval/call.rs | |
| parent | 0de4f3ed7bb20a94fd58f93b0793d3b5a8e13972 (diff) | |
Many more expressions 🥗
Boolean, equality, comparison and assignment expression parsing and evaluation.
Diffstat (limited to 'src/eval/call.rs')
| -rw-r--r-- | src/eval/call.rs | 36 |
1 files changed, 15 insertions, 21 deletions
diff --git a/src/eval/call.rs b/src/eval/call.rs index d57ed144..7b45c09a 100644 --- a/src/eval/call.rs +++ b/src/eval/call.rs @@ -1,32 +1,26 @@ use super::*; -use crate::diag::Deco; impl Eval for Spanned<&ExprCall> { type Output = Value; fn eval(self, ctx: &mut EvalContext) -> Self::Output { - let name = &self.v.name.v; - let span = self.v.name.span; - - if let Some(value) = ctx.scopes.get(name) { - if let Value::Func(func) = value { - let func = func.clone(); - ctx.deco(Deco::Resolved.with_span(span)); - - let mut args = self.v.args.as_ref().eval(ctx); - let returned = func(ctx, &mut args); - args.finish(ctx); - - return returned; - } else { - let ty = value.type_name(); - ctx.diag(error!(span, "expected function, found {}", ty)); - } - } else if !name.is_empty() { - ctx.diag(error!(span, "unknown function")); + let callee = self.v.callee.eval(ctx); + + if let Value::Func(func) = callee { + let func = func.clone(); + let mut args = self.v.args.as_ref().eval(ctx); + let returned = func(ctx, &mut args); + args.finish(ctx); + + return returned; + } else if callee != Value::Error { + ctx.diag(error!( + self.v.callee.span, + "expected function, found {}", + callee.type_name(), + )); } - ctx.deco(Deco::Unresolved.with_span(span)); Value::Error } } |
