static public Constant Compute(FunctionDefinition f, List <Constant> variables) { List <Constant> args = new List <Constant>(); if (variables.Count < f.Signature.Arguments.Count) { if (f.Signature.defaultArgs >= f.Signature.Arguments.Count - variables.Count) { for (int i = 0; i < variables.Count; i++) { Constant var; try { var = Convert(variables[i], f.Signature.Arguments[i].Type); } catch (TypeConversionError exc) { throw new Exception($"Невозможно преобразовать аргумент {i+1} из \"{exc.Src}\" в \"{exc.Dst}\""); } args.Add(var); } for (int j = variables.Count; j < f.Signature.Arguments.Count; j++) { args.Add(f.Signature.Arguments[j].DefaultValue); } return(f.Exec(args)); } else { throw new Exception("Неправильное число аргументов в функции"); } } for (int i = 0; i < f.Signature.Arguments.Count; i++) { Constant var; try { var = Convert(variables[i], f.Signature.Arguments[i].Type); } catch (TypeConversionError exc) { throw new Exception($"Невозможно преобразовать аргумент {i + 1} из \"{exc.Src}\" в \"{exc.Dst}\""); } args.Add(var); } if (variables.Count > f.Signature.Arguments.Count) { if (f.Signature.variableLength) { for (int i = f.Signature.Arguments.Count; i < variables.Count; i++) { args.Add(variables[i]); } } else { throw new Exception("Неправильное число аргументов в функции"); } } return(f.Exec(args)); }