6.1 Declaring Types

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

%typedef: type_nametype_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_nameother_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: