HELP NEWANYARRAY                              Steven Hardy, January 1978
                                            John Williams, December 1984
                                                    A. Sloman April 1986

NEWANYARRAY is used for creating arrays. The main formats are:

  newanyarray(boundslist,
                optional-initialise-pdr,
                object,
                optional-by-row);
OR

  newanyarray(boundslist,
                optional-initialise-pdr,
                init-pdr,
                subscr-pdr,
                optional-by-row)

See HELP * ARRAYS for a general introduction to arrays in POP-11
and REF *ARRAYS for more formal specifications.

NEWANYARRAY is the most general procedure for creating arrays in POP-11.
It gives far more flexibility than * NEWARRAY, in particular allowing
arrays to be constructed from user-defined vector types or vector types
which are more compact than standard POP-11 vectors. For instance,
byte arrays may be constructed. (See HELP * STRINGS).

NEWANYARRAY takes between two and six arguments, depending on how the
array and its components are initialised. The permitted argument values
are described below.


(1) A boundslist (a list of integers) specifying the size of the
    array. If the list has 2N integers an N-dimensional array is created.
    The Kth pair of integers specifies the bounds of the Kth dimension -
    the permitted range of values for the Kth subscript of the array.
    Thus [1 10] specifies a one-dimensional array, components numbered
    from one to ten; whereas [1 10 3 20] specifies a two dimensional
    array of 180 elements. The lower bound need not be 1 (as here):
    [-5 5] specifies a one dimensional array with eleven components.


(2) An optional procedure to specify the initial contents of the
    array. The results of applying this procedure to every possible set
    of subscript values are stored in the array. The procedure must take
    N arguments if the array is N-dimensional. For example, to create a
    "multiplication" table, supply NONOP * as the second argument.
    (See HELP * NONOP)

    Instead of a procedure this argument can be a constant, though if it
    is a list it may not contain more than one element (to prevent
    confusion with the boundslist.) So, to initialise every element of
    the array to the empty list, supply [] as the second argument.

    The second argument is optional.  If not supplied, the array is
    initialized with *UNDEF in the case of a full vector, and zero
    otherwise.


3)  This argument either (a) supplies a vector class object (see
    *VECTORCLASS) in which the elements of the array are to be stored,
    or (b) specifies how such an object is to be created. This
    specification may be a vector type KEY, or constructor procedure,
    like INITV or INITS. (See HELP * KEYS)

    If the third argument is an array, its *ARRAYVECTOR is used to store
    the components of the new array. Thus two different arrays, with
    different boundslists, can access and update the same information,
    possibly viewing it as differently organised. Or one may access a
    sub-array of the other.

    When an array or vector is supplied, its size must be consistent
    with the array size indicated by the boundslist. For example, doing

        newanyarray([1 4 0 2], {a vector with only six elements})

    will cause a *MISHAP, since the bounds specify an array that can
    hold twelve elements. However, the reverse constraint does NOT
    apply: the vector can be larger than the bounds require.


(4) This argument specifies the subscriptor procedure used to access
    the vector class object in which the array elements are stored.
    It is optional unless argument (3) was a vector class initialiser
    procedure. If a subscriptor procedure is not supplied, it is
    defaulted from the class subscriptor of the array vector. Note that
    the subscriptor procedure cannot be an array, because it would then
    be confused with argument (3).


 5) This argument is optional. If present, it should be an integer
    "index offset" into the vector. This specifies where the portion of
    the vector used by the array should begin. Thus, if VEC is a fifteen
    element vector, the array created by

        newanyarray([1 3 1 3], vec, 5)

    uses elements 6 - 14 (inclusive) of VEC.


(6) This argument is also optional. If supplied, it should be a boolean,
    which is locally assigned to the variable POPARRAY_BY_ROW. This
    controls the mapping between subscripts and positions in the
    underlying *ARRAYVECTOR. For example:

        vars a b;
        newanyarray([1 3 1 3], {a b c d e f g h i}, true) -> a;
        newanyarray([1 3 1 3], {a b c d e f g h i}, false) -> b;
        a(3,1) =>
        ** c
        b(3,1) =>
        ** g

    The value of POPARRAY_BY_ROW is irrelevant when creating
    one-dimensional arrays.


-- Some examples ------------------------------------------------------

To create a multiplication table:

    vars m;
    newanyarray([1 12 1 12], nonop *, initv, subscrv) -> m;
    m(4,3) =>
    ** 12


To create a turtle type picture, using a string to store the components:

    vars pic;
    newanyarray([1 10 1 10], `\s`, datakey('a string')) -> pic;
    pic(5,5) =>
    ** 32


To turn an existing string of "noughts-and-crosses" into an array:

    vars oxo;
    newanyarray([1 3 1 3], '0 X X00 X') -> oxo;
    cucharout(oxo(1,3));
    0

If, in the previous example, we make the array by row instead of by
column, the mapping between subscripts and positions in the string is
"reversed":

    vars oxo2;
    newanyarray([1 3 1 3], '0 X X00 X', false) -> oxo2;
    cucharout(oxo2(1,3));
    X


------------------------------------------------------------------------

See also:
    HELP * ARRAYS
    HELP * ARRAYVECTOR
    HELP * ISARRAY
    HELP * NEWARRAY
    REF  * ARRAYS
    REF  * ARRAYSCAN

--- C.all/help/newanyarray ---------------------------------------------
--- Copyright University of Sussex 1987. All rights reserved. ----------
