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));
            }