public LispValue funcall(SECDMachine machine, LispValue args)
  {
    if (f_function == null)
      throw new LispValueNotAFunctionException("The first argument to FUNCALL");
    else
    {
      // push the args back on the stack
      for (LispValue v = args; v != NIL; v = cdr(v))
    	  machine.S.push(car(v));

      // get the function, and push it on the code stack.
      // Note that we don't do error checking on the number
      // of arguments.  This is bad...
      machine.C.pop();                     // Pop the funcall function off.
      machine.C.push(((LispFunction)f_function).getCode());   // Push the new one on.
    }

    return NIL;
  }