summaryrefslogtreecommitdiff
path: root/src/eval/call.rs
diff options
context:
space:
mode:
authorLaurenz <laurmaedje@gmail.com>2021-01-22 17:16:42 +0100
committerLaurenz <laurmaedje@gmail.com>2021-01-22 17:16:42 +0100
commitac788f2082711161ec8208eede04d9a2bae02241 (patch)
treeb139e41d327af906163c0b177d402b855c04507e /src/eval/call.rs
parent0de4f3ed7bb20a94fd58f93b0793d3b5a8e13972 (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.rs36
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
}
}