static List <OpSignature> GetMathMethods()
        {
            var funcNames   = Enum.GetNames(typeof(MathOps)).Select(s => s.ToLower()).ToHashSet();
            var mathMethods = typeof(math).GetMethods(BindingFlags.Public | BindingFlags.Static);
            var res         = new List <OpSignature>(mathMethods.Length);

            foreach (var m in mathMethods)
            {
                if (funcNames.Contains(m.Name))
                {
                    ValueType returnType = TypeToValueType(m.ReturnType);
                    if (returnType != ValueType.Unknown)
                    {
                        var paramTypes = m.GetParameters().Select(p => TypeToValueType(p.ParameterType)).ToArray();
                        if (paramTypes.All(p => p != ValueType.Unknown))
                        {
                            res.Add(new OpSignature(returnType, m.Name.Capitalize(), paramTypes));
                        }
                    }
                }
            }
            return(res);
        }
 public static OpSignature LinearBinOp(CustomOps opType, ValueType valueType)
 {
     return(new OpSignature(valueType, opType, valueType, valueType));
 }
 public OpSignature(ValueType @return, string opType, params ValueType[] @params)
 {
     Params = @params;
     Return = @return;
     OpType = opType;
 }
 public OpSignature(ValueType @return, CustomOps opType, params ValueType[] @params)
     : this(@return, opType.ToString(), @params)
 {
 }