protected object EvaluateFunCallExpr(AstFunCallExpr expr) { if (HadErrorOrReturn()) { return(null); } object calleeObj = EvaluateExpr(expr.m_callee); IFunction callee = calleeObj as IFunction; if (callee != null) { if (expr.m_args.Count != callee.ArgCount()) { // TODO: print function name in the error m_runtimeError = true; Lox.Error(expr.m_startLine, "Function expected " + callee.ArgCount() + " arguments, but was passed " + expr.m_args.Count); return(null); } List <object> args = new List <object>(); foreach (AstExpr argExpr in expr.m_args) { args.Add(EvaluateExpr(argExpr)); } return(callee.Call(this, args)); } else { // TODO: Distinguish between someUnknownFunction() and (3 + 1)() ? // It would be nice to be able to print the name of the function in the former case m_runtimeError = true; Lox.Error(expr.m_startLine, "Invalid function call"); return(null); } }