Testing latest pari + WASM + node.js... and it works?! Wow.
License: GPL3
ubuntu2004
Function: apply
Section: programming/specific
C-Name: apply0
Prototype: GG
Help: apply(f, A): apply function f to each entry in A.
Wrapper: (G)
Description:
(closure,gen):gen genapply(${1 cookie}, ${1 wrapper}, $2)
Doc: Apply the \typ{CLOSURE} \kbd{f} to the entries of \kbd{A}.
\item If \kbd{A} is a scalar, return \kbd{f(A)}.
\item If \kbd{A} is a polynomial or power series $\sum a_i x^i$ ($+
O(x^N)$), apply \kbd{f} on all coefficients and return $\sum f(a_i) x^i$ ($+
O(x^N)$).
\item If \kbd{A} is a vector or list $[a_1,\dots,a_n]$, return the vector
or list $[f(a_1),\dots, f(a_n)]$. If \kbd{A} is a matrix, return the matrix
whose entries are the $f(\kbd{A[i,j]})$.
\bprog
? apply(x->x^2, [1,2,3,4])
%1 = [1, 4, 9, 16]
? apply(x->x^2, [1,2;3,4])
%2 =
[1 4]
[9 16]
? apply(x->x^2, 4*x^2 + 3*x+ 2)
%3 = 16*x^2 + 9*x + 4
? apply(sign, 2 - 3* x + 4*x^2 + O(x^3))
%4 = 1 - x + x^2 + O(x^3)
@eprog\noindent Note that many functions already act componentwise on
vectors or matrices, but they almost never act on lists; in this case,
\kbd{apply} is a good solution:
\bprog
? L = List([Mod(1,3), Mod(2,4)]);
? lift(L)
*** at top-level: lift(L)
*** ^-------
*** lift: incorrect type in lift.
? apply(lift, L);
%2 = List([1, 2])
@eprog
\misctitle{Remark} For $v$ a \typ{VEC}, \typ{COL}, \typ{VECSMALL},
\typ{LIST} or \typ{MAT}, the alternative set-notations
\bprog
[g(x) | x <- v, f(x)]
[x | x <- v, f(x)]
[g(x) | x <- v]
@eprog\noindent
are available as shortcuts for
\bprog
apply(g, select(f, Vec(v)))
select(f, Vec(v))
apply(g, Vec(v))
@eprog\noindent respectively:
\bprog
? L = List([Mod(1,3), Mod(2,4)]);
? [ lift(x) | x<-L ]
%2 = [1, 2]
@eprog
\synt{genapply}{void *E, GEN (*fun)(void*,GEN), GEN a}.