public SEXP evaluate(SEXP expression, Environment rho) { if (expression instanceof Symbol) { return evaluateSymbol((Symbol) expression, rho); } else if (expression instanceof ExpressionVector) { return evaluateExpressionVector((ExpressionVector) expression, rho); } else if (expression instanceof FunctionCall) { return evaluateCall((FunctionCall) expression, rho); } else if (expression instanceof Promise) { return expression.force(this); } else if (expression != Null.INSTANCE && expression instanceof PromisePairList) { throw new EvalException("'...' used in an incorrect context"); } else { clearInvisibleFlag(); return expression; } }