Example #1
0
    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);
        }
    }