The record construction provides functions for manipulating record (structure)
values and variables.  Unlike a product variable, a record variable can be
viewed as a collection of component variables, each of which can be
separately updated.  A record construction is written as:

        record { id1: type_expr1; ...; idn: type_exprn }
                
All type expressions must have signatures which include New, V, and
assignment, with the standard signatures.  It has signature:

        type t {
            New; V; :=;
            Mk: func [val type_expr1; ...; val type_exprn] val t;
            id1: field type_expr1;
            ...
            idn: field type_exprn;
        }

The abbreviation

            id: field type_expr;

is accepted instead of

            id: func [val t] val type_expr;
            id: func [var t] var type_expr;

where t is the local type identifier.  Similarly

            id: readonly field type_expr;

is accepted inside a type signature instead of the first of these two
function component signatures.

Note on Semantics: As a small concession to efficiency, the assignment
operation returns the right operand, rather than a new value constructed
from the results of the component assignments.

Implementation Note: New, V , and := on records are rather inefficient.
Products are frequently preferable.  A redesign of the language might
omit records altogether.

See also: product
