示例#1
0
 // 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));
   }
 }