pub trait FunctionDefinition {
// Required methods
fn required_parameters(&self) -> usize;
fn optional_parameters(&self) -> usize;
fn check_types(&self, args: &[Rc<VariableType>]) -> FunctionTypecheck;
fn call(&self, args: Arguments<'_>) -> Result<Variable>;
fn param_type(&self, index: usize) -> String;
fn return_type(&self) -> String;
}