microcad_lang/eval/
function.rs1use microcad_lang_base::PushDiag;
7
8use crate::{eval::*, syntax::*, value::*};
9
10impl CallTrait for FunctionDefinition {
11 fn call(&self, args: &ArgumentValueList, context: &mut EvalContext) -> EvalResult<Value> {
12 match ArgumentMatch::find_multi_match(args, &self.signature.parameters.eval(context)?) {
13 Ok(matches) => {
14 let mut result: Vec<Value> = Vec::new();
15 for args in matches.args {
16 let value: Value = context
17 .scope(StackFrame::Function(self.id(), args.into()), |context| {
18 self.body.statements.eval(context)
19 })?;
20 result.push(value.un_return());
21 }
22 if result.len() == 1 {
23 Ok(result.first().expect("one result item").clone())
24 } else {
25 Ok(Value::Array(result.into_iter().collect()))
26 }
27 }
28
29 Err(err) => {
30 context.error(args, err)?;
31 Ok(Value::None)
32 }
33 }
34 }
35}