microcad-lang 0.5.0

µcad language
Documentation
// Copyright © 2025-2026 The µcad authors <info@microcad.xyz>
// SPDX-License-Identifier: AGPL-3.0-or-later

//! µcad Function call evaluation

use microcad_lang_base::PushDiag;

use crate::{
    eval::*,
    lower::{Identifiable, ir},
    value::*,
};

impl CallTrait for ir::FunctionDefinition {
    fn call(&self, args: &ArgumentValueList, context: &mut EvalContext) -> EvalResult<Value> {
        match ArgumentMatch::find_multi_match(args, &self.signature.parameters.eval(context)?) {
            Ok(matches) => {
                let mut result: Vec<Value> = Vec::new();
                for args in matches.args {
                    let value: Value = context
                        .scope(StackFrame::Function(self.id(), args.into()), |context| {
                            self.body.statements.eval(context)
                        })?;
                    result.push(value.un_return());
                }
                if result.len() == 1 {
                    Ok(result.first().expect("one result item").clone())
                } else {
                    Ok(Value::Array(result.into_iter().collect()))
                }
            }

            Err(err) => {
                context.error(args, err)?;
                Ok(Value::None)
            }
        }
    }
}