Function: call
Section: programming/specific
C-Name: call0
Prototype: GG
Help: call(f,A): A being a vector, evaluates f(A[1],...,A[#A]).
Doc: $A=[a_{1},\dots, a_{n}]$ being a vector and $f$ being a function,
 returns the evaluation of $f(a_{1},\dots,a_{n})$.
 $f$ can also be the name of a built-in GP function.
 If $\# A =1$, \tet{call}($f,A$) = \tet{apply}($f,A$)[1].
 If $f$ is variadic (has a variable number of arguments), then
 the variadic arguments are grouped in a vector in the last component of $A$.

 This function is useful

 \item when writing a variadic function, to call another one:
 \bprog
 fprintf(file,format,args[..]) = write(file, call(strprintf,[format,args]))
 @eprog

 \item when dealing with function arguments with unspecified arity.

 The function below implements a global memoization interface:
 \bprog
 memo=Map();
 memoize(f,A[..])=
 {
   my(res);
   if(!mapisdefined(memo, [f,A], &res),
     res = call(f,A);
     mapput(memo,[f,A],res));
  res;
 }
 @eprog
 for example:
 \bprog
 ? memoize(factor,2^128+1)
 %3 = [59649589127497217,1;5704689200685129054721,1]
 ? ##
   ***   last result computed in 76 ms.
 ? memoize(factor,2^128+1)
 %4 = [59649589127497217,1;5704689200685129054721,1]
 ? ##
   ***   last result computed in 0 ms.
 ? memoize(ffinit,3,3)
 %5 = Mod(1,3)*x^3+Mod(1,3)*x^2+Mod(1,3)*x+Mod(2,3)
 ? fibo(n)=if(n==0,0,n==1,1,memoize(fibo,n-2)+memoize(fibo,n-1));
 ? fibo(100)
 %7 = 354224848179261915075
 @eprog

 \item to call operators through their internal names without using
 \kbd{alias}
 \bprog
 matnbelts(M) = call("_*_",matsize(M))
 @eprog

