# Set, array, and record constructors

A set constructor has the form:

        S{e_1, ..., e_n}

where `S` is a set type and the `e`'s are expressions or ranges of the form `lo..hi`. The constructor denotes a value of type `S` containing the listed values and the values in the listed ranges. The `e`'s, `lo`'s, and `hi`'s must be assignable to the element type of `S`.

An array constructor has the form:

        A{e_1, ..., e_n}

where `A` is an array type and the `e`'s are expressions. The constructor denotes a value of type `A` containing the listed elements in the listed order. The `e`'s must be assignable to the element type of `A`. This means that if `A` is a multi-dimensional array, the `e`'s must themselves be array-valued expressions.

If `A` is a fixed array type and `n` is at least 1, then `e_n` can be followed by "`, ..`" to indicate that the value of `e_n` will be replicated as many times as necessary to fill out the array. It is a static error to provide too many or too few elements for a fixed array type.

A record constructor has the form:

        R{Bindings}

where `R` is a record type and `Bindings` is a list of keyword or positional bindings, exactly as in a procedure call. The list of bindings is rewritten to fit the list of fields and defaults of `R`, exactly as for a procedure call; the record field names play the role of the procedure formal parameters. The expression denotes a value of type `R` whose field values are specified by the rewritten binding.

The rewritten binding must bind only field names and must bind each field name exactly once. Each expression in the binding must be assignable to the type of the corresponding record field.

    Last modified on Wed Apr  3 09:39:10 PST 1996 by heydon
         modified on Mon Apr 18 14:02:28 PDT 1994 by kalsow