Function: apply
apply is a function defined in eval.c.
Signature
(apply FUNCTION &rest ARGUMENTS)
Documentation
Call FUNCTION with our remaining args, using our last arg as list of args.
Then return the value FUNCTION returns. With a single argument, call the argument's first element using the other elements as args. Thus, (apply '+ 1 2 '(3 4)) returns 10.
Probably introduced at or before Emacs version 15.
Aliases
multiple-value-call (obsolete since 27.1)
cl-multiple-value-call
Source Code
// Defined in /usr/src/emacs/src/eval.c
{
ptrdiff_t i, funcall_nargs;
Lisp_Object *funcall_args = NULL;
Lisp_Object spread_arg = args[nargs - 1];
Lisp_Object fun = args[0];
USE_SAFE_ALLOCA;
ptrdiff_t numargs = list_length (spread_arg);
if (numargs == 0)
return Ffuncall (max (1, nargs - 1), args);
else if (numargs == 1)
{
args [nargs - 1] = XCAR (spread_arg);
return Ffuncall (nargs, args);
}
numargs += nargs - 2;
/* Optimize for no indirection. */
if (SYMBOLP (fun) && !NILP (fun)
&& (fun = XSYMBOL (fun)->u.s.function, SYMBOLP (fun)))
{
fun = indirect_function (fun);
if (NILP (fun))
/* Let funcall get the error. */
fun = args[0];
}
if (SUBRP (fun) && XSUBR (fun)->max_args > numargs
/* Don't hide an error by adding missing arguments. */
&& numargs >= XSUBR (fun)->min_args)
{
/* Avoid making funcall cons up a yet another new vector of arguments
by explicitly supplying nil's for optional values. */
SAFE_ALLOCA_LISP (funcall_args, 1 + XSUBR (fun)->max_args);
memclear (funcall_args + numargs + 1,
(XSUBR (fun)->max_args - numargs) * word_size);
funcall_nargs = 1 + XSUBR (fun)->max_args;
}
else
{ /* We add 1 to numargs because funcall_args includes the
function itself as well as its arguments. */
SAFE_ALLOCA_LISP (funcall_args, 1 + numargs);
funcall_nargs = 1 + numargs;
}
memcpy (funcall_args, args, nargs * word_size);
/* Spread the last arg we got. Its first element goes in
the slot that it used to occupy, hence this value of I. */
i = nargs - 1;
while (!NILP (spread_arg))
{
funcall_args [i++] = XCAR (spread_arg);
spread_arg = XCDR (spread_arg);
}
Lisp_Object retval = Ffuncall (funcall_nargs, funcall_args);
SAFE_FREE ();
return retval;
}