// Function application. Execute the first AST and verify that it is a // function. Then call that function's apply method. @Override public Val exec(Env env) { Val fun = _asts[0].exec(env); if (!fun.isFun()) throw new IllegalArgumentException("Expected a function but found " + fun.getClass()); AST ast = ((ValFun) fun)._ast; int nargs = ast.nargs(); if (nargs != -1 && nargs != _asts.length) throw new IllegalArgumentException( "Incorrect number of arguments; '" + ast + "' expects " + nargs + " but was passed " + _asts.length); try (Env.StackHelp stk = env.stk()) { return stk.returning(ast.apply(env, stk, _asts)); } }