Modula-3: Record types

# Record types

A record is a sequence of named variables, called the fields of the record. Different fields can have different types. The name and type of each field is statically determined by the record's type. The expression `r.f` designates the field named `f` in the record `r`.

A record type declaration has the form:

        TYPE T = RECORD FieldList END

where `FieldList` is a list of field declarations, each of which has the form:

        fieldName: Type := default

where `fieldName` is an identifier, `Type` is any non-empty type other than an open array type, and `default` is a constant expression. The field names must be distinct. A record is a member of `T` if it has fields with the given names and types, in the given order, and no other fields. Empty records are allowed.

The constant `default` is a default value used when a record is constructed or allocated. Either "`:= default`" or "`: Type`" can be omitted, but not both. If `Type` is omitted, it is taken to be the type of `default`. If both are present, the value of `default` must be a member of `Type`.

When a series of fields shares the same type and default, any `fieldName` can be a list of identifiers separated by commas. Such a list is shorthand for a list in which the type and default are repeated for each identifier. That is:

        f_1, ..., f_m: Type := default

is shorthand for:

        f_1: Type := default; ...; f_m: Type := default

This shorthand is eliminated from the expanded definition of the type. The default values are included.

Examples of record types:

        TYPE
          Time = RECORD
            seconds: INTEGER;
            milliseconds: [0..999]
          END;

          Alignment = {Left, Center, Right};

          TextWindowStyle = RECORD
             align          := Alignment.Center;
             font           := Font.Default;
             foreground     := Color.Black;
             background     := Color.White;
             margin, border := 2
          END

    Last modified on Wed Apr  3 09:38:59 PST 1996 by heydon
         modified on Mon Apr 18 14:06:17 PDT 1994 by kalsow