public static EvalResult binary_typeCheck(SymbolTable symbols, FunCall funcall, string funcName, EvalFunc f) { var left = funcall.args[0].value; var right = funcall.args[1].value; Func<Token, bool> isNumber = token => token.type == Lexical.Int || token.type == Lexical.Float; bool areNumbers = isNumber(left) && isNumber(right); if (areNumbers || left.type == right.type) return f(symbols, funcall); else return new EvalResult(new Error(0, "Non-matching types for " + funcName)); }
public static EvalResult eval_args(SymbolTable symbols, FunCall funcall, string funcName, int numArgs, EvalFunc f) { var evaled_args = funcall.args.Select(i => evaluate_FunCall(symbols, i)).ToList(); if (evaled_args.Count() > numArgs) return new EvalResult(new Error(0, "Too many arguments to " + funcName + "!")); if (evaled_args.Count() < numArgs) return new EvalResult(new Error(0, "Too few arguments to " + funcName + "!")); foreach(var result in evaled_args) if (result.left == null) return new EvalResult(result.right); var results = FunCall.id_list(evaled_args.Select(a => a.left.Item2).ToList()); return f(symbols, results); }