#### 6.1.3 A Few Examples of Array and Record Use

Array and record types make composing readable Sisal programs easy and convenient. The syntax rules for using them correctly arise immediately from the semantic rules we have already touched on: every Sisal statement is an expression, and all expressions return specific values of specific types. Consider the following example:
```let x_diff := x - x;
y_diff := y - y;
xd_sq := x_diff * x_diff;
yd_sq := y_diff * Y_diff
in  sqrt( xd_sq + yd_sq )
end let
```
This is the calculation of the magnitude of separation of two two-space vectors. The vectors are named x and y, and their components are indexed in the usual way, using square brackets to separate the index expressions from the value names. Alternatively, we could represent the vectors as records, whose fields contain the components, and the calculation would them be as follows:
```let x_diff := v1.x - v2.x;
y_diff := v1.y - v2.y;
xd_sq := x_diff * x_diff;
yd_sq := y_diff * Y_diff
in  sqrt( xd_sq + yd_sq )
end let
```
Here we have the two records, named v1 and v2, with fields in each named x and y. The record notation allows us to name the fields, and refer to them by use of the record and field names separated by a period. A third alternative we could use would allow a combination of these two notations, as follows:
```let x_diff := vectors.x - vectors.x;
y_diff := vectors.y - vectors.y;
xd_sq := x_diff * x_diff;
yd_sq := y_diff * Y_diff
in  sqrt( xd_sq + yd_sq )
end let
```
Here we have an array, named vectors, whose elements are records. We index the individual records as array elements, and their components as record fields. But both these examples assume aggregates that already exist. How does one go about creating them?