|
  
dolist and domatrix
After a function has been defined, it can be applied to a list
of argument values even if the function is not defined for lists.
This is accomplished using the dolist and domatrix
keywords. These statements have the format
dolist f(x,y)
domatrix f(x,y)
For example, assume you have defined the function
Quad(x):=x*x+5x+3
Next, assume you want to apply this function to every element
in the list named Points:
Points:=[1,2,3,4,5]
You do this with the expression
dolist Quad(Points)
Which will produce the result [9,17,27,39,53].
If the function you supply accepts only one argument, f(x),
dolist and domatrix do the same thing. That is,
dolist f(a) =
[f(a[0]),f(a[1]),f(a[2]),...]
domatrix f(a) = [f(a[0]),f(a[1]),f(a[2]),...]
For example,
dolist F(1..4) =
[F(1),F(2),F(3),F(4)]
If the function you supply accepts more than one argument, f(x,y),
domatrix causes all permutations of all arguments to be
applied while dolist treats the argument lists as
parallel. That is,
dolist f(a,b) = [
f(a[0],b[0]),
f(a[1],b[1]),
f(a[2],b[2]),
...
]
domatrix f(a,b) = [
[f(a[0],b[0]),f(a[0],b[1]),f(a[0],b[2]),...],
[f(a[1],b[0]),f(a[1],b[1]),f(a[1],b[2]),...],
[f(a[2],b[0]),f(a[2],b[1]),f(a[2],b[2]),...],
...
]
For example, if you define f(x,y) as
Multiply(x,y):=x*y
then, the expression
dolist Multiply(1..10,1..10)
produces the 10-element vector
1
4
9
25
36
49
64
81
100
However, the expression
domatrix Multiply(1..10,1..10)
produces the 100-element matrix
1 2 3 4 5 6 7 8 9 10
2 4 6 8 10 12 14 16 18 20
3 6 9 12 15 18 21 24 27 30
4 8 12 16 20 24 28 32 36 40
5 10 15 20 25 30 35 40 45 50
6 12 18 24 30 36 42 48 54 60
7 14 21 28 35 42 49 56 63 70
8 16 24 32 40 48 56 64 72 80
9 18 27 36 45 54 63 72 81 90
10 20 30 40 50 60 70 80 90 100
The dolist and domatrix keywords can be used
with any functions including primitives and user-defined
functions. In addition, the list arguments can contain other
lists or matrices as elements. That is, dolist F([A,B,C]) = [F(A),F(B),F(C)]
even if A, B, and C
are themselves lists or matrices.
|