element in rec
Usually the membership test is only defined for lists. However a record
may contain a special operations
record, that contains a function that
is called when this record is the right operand of the in
operator.
The precise mechanism is as follows.
If the right operand of the in
operator is a record, and if this record
contains an element with the name operations
that is a record, and if
this record in turn contains an element with the name in
that is a
function, then this function is called with the two operands as
arguments, and the value of the membership test is the value returned by
that function. The function should of course return true
or false
.
The following example shows one piece of the definition of residue
classes, using record operations. Of course this is far from a complete
implementation (see About Defining New Group Elements). Note that the
in
must be quoted, so that it is taken as an identifier (see
Identifiers).
gap> ResidueClassOps := rec( );; gap> ResidueClassOps.\in := function ( l, r ) > if IsInt( l ) then > return (l - r.representative) mod r.modulus = 0; > else > return false; > fi; > end;; gap> ResidueClass := function ( representative, modulus ) > return rec( > representative := representative, > modulus := modulus, > operations := ResidueClassOps ); > end;; gap> l := ResidueClass( 13, 23 );; gap> -10 in l; true gap> 10 in l; false
GAP 3.4.4