Manifest array

Manifest arrays provide a shortcut to create and initialize an array object using a single expression rather than a creation instruction followed by a sequence of insertions of new elements to the array. The lower index of a manifest array is always 1 and the upper index is the number of items.

Manifest arrays come in two flavors: typed and untyped with slightly different validity rules and run-time behavior.

Typed manifest array

A typed manifest array has an explicit Manifest_array_type that should resolve to an ARRAY type. It is used to create an object to be filled with specified elements. Every element should be compatible with the specified element type. For example, the expression

{ARRAY [COMPARABLE]} <<7, "beers">>

creates an array of type ARRAY [COMPARABLE] with 2 elements: 7 and "beers" and is therefore equivalent to the value of an imaginary variable x of type ARRAY [COMPARABLE] initialized as follows:

create x.make (1, 0) x.force (7, 1) x.force ("beers", 2)

It would be an error to use default_pointer instead of "beers" because the type POINTER is not COMPARABLE. Similarly, one cannot specify LIST or a formal generic instead of ARRAY. Also, the explicit manifest array type cannot be separate.

Untyped manifest array

An untyped manifest array has no Manifest_array_type part. As a result, its type is computed from the type of specified elements as a common ancestor type. So, the type of the expression <<7, "beers">> would be ARRAY [ANY] rather than ARRAY [COMPARABLE] because types of the elements do not conform to each other. On the other hand, the expression <<True, False, False>> has type ARRAY [BOOLEAN].

Because there is always a common ancestor type for manifest array elements, the untyped manifest array is always valid as soon as all its elements are valid. The empty untyped manifest array has type ARRAY [NONE].