2.7 Dimension Lists
You should strive to write Yorick programs in such a way that you never need to refer to the lengths of array dimensions. Array dimensions are usually of no direct significance in a calculation; your programs will tend to be clearer if only the arrays themselves appear.
In practice, unfortunately, you can't always get by without mentioning dimension lengths. Two functions are important:
- returns the total number of items in the array x.
- returns a list consisting of the number of dimensions of the array x,
followed by the length of each of those dimensions. Thus, if x were
a nine-by-two-by-six array, dimsof(x) would return [3,9,2,6],
while if x were a scalar value, dimsof(x) would return
- dimsof(x, y, z, ...)
- With multiple arguments, the dimsof function returns the dimension list of the array x+y+z+..., or  if the input arrays are not conformable.
The array function (see section 2.1 Creating Arrays), and the more arcane functions add_variable, add_member, and reshape all have parameter lists ending with one or more "dimension list" parameters. Each parameter in a dimension list can be either a scalar integer value, representing the length of a single dimension, or a list of integers in the format returned by dimsof to represent zero or more dimensions. Several arguments can be used to build up a complicated dimension list:
x1 = array(0.0, 9, 2, 6); /* 9-by-2-by-6 array of 0.0 */ x2 = array(0.0, [3,9,2,6]); /* another 9-by-2-by-6 array */ x3 = array(0.0, 9, , [2,2,6]); /* ...and yet another */ flux= array(0.0, 3, dimsof(z), numberof(groups));
In the final example, the flux might represent the three components of a flux vector, at each of a number of positions z, and for each of a number of photon energies groups. The first dimension of flux has length three, corresponding to the three components of each flux vector. The last dimension has the same length as the groups array. In between are zero or more dimensions -- whatever the dimensions of the array of positions z.
By using the rubber index syntax (see section 2.3.7 Using a rubber index), you can extract meaningful slices of the flux array without ever needing to know how many dimensions z had, let alone their lengths.