6.1 Declaring Types

A type can be declared in a record descriptor by using the %typedef special field. The syntax is:

%typedef: type_name type_description

Where type_name is the name of the new type, and type_description a description which varies depending of the kind of type. For example, this is how a type Age_t could be defined as numbers in the range 0..120:

%typedef: Age_t range 0 120

Type names are identifiers having the following syntax:

[a-zA-Z][a-zA-Z0-9_]*

Even though any identifier with that syntax could be used for types, it is a good idea to consistently follow some convention to help distinguishing type names from field names. For example, the _t suffix could be used for types.

A type can be declared to be an alias for another type. The syntax is:

%typedef: type_name other_type_name

Where type_name is declared to be a synonym of other_type_name. This is useful to avoid duplicated type descriptions. For example, consider the following example:

%typedef: Id_t          int
%typedef: Item_t        Id_t
%typedef: Transaction_t Id_t

Both Item_t and Transaction_t are aliases for the type Id_t. Which is in turn an alias for the type int. So, they are both numeric identifiers.

The order of the %typedef fields is not relevant. In particular, a type definition can forward-reference another type that is defined subsequently. The previous example could have been written as:

%typedef: Item_t        Id_t
%typedef: Transaction_t Id_t
%typedef: Id_t          int

Integrity check will complain if undefined types are referenced. As well as when any aliases up referencing back (looping back directly or indirectly) in type declarations. For example, the following set of declarations contains a loop. Thus, it’s invalid:

%typedef: A_t B_t
%typedef: B_t C_t
%typedef: C_t A_t

The scope of a type is the record descriptor where it is defined.