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