NAME
    =

SYNOPSIS
    a = b
    a = {e_1, e_2, ...[ { ... } ] }

TYPES
    a			lvalue, current value a structure in { } case

    b			expression

    e_0, e_1, ...	expressions, blanks, or initializer lists


    return		lvalue (a)

DESCRIPTION
    Here an lvalue is either a simple variable specified by an identifier,
    or an element of an existing structure specified by one or more
    qualifiers following an identifier.

    An initializer list is a comma-separated list enclosed in braces as in

		{e_0, e_1, ... }

    where each e_i is an expression, blank or initializer list.

    a = b evaluates b, assigns its value to a, and returns a.

    a = {e_0, e_1, ... } where the e_i are expressions or blanks,
    requires the current value of a to be a matrix, list
    or object with at least as many elements as listed e_i.  Each non-blank
    e_i is evaluated and its value is assigned to a[[i]]; elements a[[i]]
    corresponding to blank e_i are unchanged.

    If, in a = {e_0, e_1, ...}, e_i is an initializer list, as in
    {e_i_0, e_1_1, ...}, the corresponding a[[i]] is to be a matrix, list
    or object with at least as many elements as listed e_i_j.  Depending on
    whether e_i_j is an expression, blank, or initializer list, one, no, or
    possibly more than one assignment, is made to a[[i]][[j]] or, if
    relevant and possible, its elements.

    In simple assignments, = associates from right to left so that, for
    example,

    		a = b = c

    has the effect of a = (b = c) and results in assigning the value of c
    to both a and b.  The expression (a = b) = c is acceptable, but has the
    effect of a = b; a = c; in which the first assignment is superseded by
    the second.

    In initializations, = { ...} associates from left to right so that,
    for example,

		a = {e_0, ... } = {v_0, ...}

    first assigns e_0, ... to the elements of a, and then assigns v_0, ...
    to the result.

    If there are side effects in the evaluations involvanged.of the "appr" configuration parameter.

    If y is zero or x is a multiple of y, appr(x,y,z) returns x.  I.e.,
    there is no "approximation" - the result represents x exactly.

    In the following it is assumed y is nonzero and x is not a multiple of y.
    For real x:

	appr(x,y,z) is either the nearest multiple of y greater
	than x or the nearest multiple of y less than x.  Thus, if
	we write a = appr(x,y,z) and r = x - a, then a/y is an integer
	and abs(r) < abs(y).  If r > 0, we say x has been "rounded down"
	to a; if r < 0, the rounding is "up".  For particular x and y,
	whether the rounding is down or up is determined by z.

	Only the 5 lowest bits of z are used, so we may assume z has been
	replaced by its value modulo 32.  The type of rounding depends on
	z as follows:

	z = 0	round down or up according as y is positive or negative,
		sgn(r) = sgn(y)

	z = 1	round up or down according as y is positive or negative,
		sgn(r) = -sgn(y)

	z = 2	round towards zero, sgn(r) = sgn(x)

	z = 3	round away from zero, sgn(r) = -sgn(x)

	z = 4	round down, r > 0

	z = 5	round up, r < 0

	z = 6	round towards or from zero acco