In the previous section it was mentioned that domains are represented by
domain records, and that each domain record has an operations record.
This operations record is used by functions like Size
to find out how
to compute this information for the domain. Let us discuss this
mechanism using the example of Size
. Suppose you call Size
with a
domain D.
First Size
tests whether D has a component called size
, i.e., if
D.size
is bound. If it is, Size
assumes that it holds the size of
the domain and returns this value.
Let us suppose that this component has no assigned value. Then Size
looks at the component D.operations
, which must be a record. Size
takes component D.operations.Size
of this record, which must be a
function. Size
calls this function passing D as argument. If a
domain record has no Size
function in its operations record, an error
is signalled.
Finally Size
stores the value returned by D.operations.Size( D )
in the component D.size
, where it is available for the next call of
Size( D )
.
Because functions like Size
do little except dispatch to the function
in the operations record they are called dispatcher functions.
Which function is called through this mechanism obviously depends on the
domain and its operations record. In principle each domain could have
its own Size
function. In practice however this is not the case. For
example all permutation groups share the operations record PermGroupOps
so they all use the same Size
function PermGroupOps.Size
.
Note that in fact domains of the same type not only share the functions,
in fact they share the operations record. So for example all permutation
groups have the same operations record. This means that changing such a
function for a domain D in the following way D.operations.function
:= new-function;
will also change this function for all domains of
the same type, even those that do not yet exist at the moment of the
assignment and will only be constructed later. This is usually not
desirable, since supposedly new-function uses some special properties
of the domain D to work efficiently. We suggest therefore, that you
use the following assignments instead:
D.operations := Copy( D.operations );
D.operations.function := new-function;
.
Some domains do not provide a special Size
function, either because no
efficient method is known or because the author that implemented the
domain simply was too lazy to write one. In those cases the domain
inherits the default function, which is DomainOps.Size
. Such
inheritance is uncommon for the Size
function, but rather common for
the Union
function.
GAP 3.4.4