The structure finite-types
has
two macros for defining `finite' record types.
These are record types for which there are a fixed number of instances,
all of which are created at the same time as the record type itself.
The syntax for defining an enumerated type is:
This defines a new record type, bound to(define-enumerated-typetag
type-name
predicate-name
vector-of-instances-name
name-accessor
index-accessor
(instance-name
...))
type-name
, with as many
instances as there are instance-name
's.
Vector-of-instances-name
is bound to a vector containing the instances
of the type in the same order as the instance-name
list.
Tag
is bound to a macro that when given an instance-name
expands
into an expression that returns corresponding instance.
The name lookup is done at macro expansion time.
Predicate-name
is a predicate for the new type.
Name-accessor
and index-accessor
are accessors for the
name and index (in vector-of-instances
) of instances of the type.
(define-enumerated-type color :color color? colors color-name color-index (black white purple maroon)) (color-name (vector-ref colors 0))->
black (color-name (color white))->
white (color-index (color purple))->
2
Finite types are enumerations that allow the user to add additional fields in the type. The syntax for defining a finite type is:
The additional fields are specified exactly as with(define-finite-typetag
type-name
(field-tag
...)predicate-name
vector-of-instances-name
name-accessor
index-accessor
(field-tag
accessor-name
[modifier-name
]) ... ((instance-name
field-value
...) ...))
define-record-type
.
The field arguments to the constructor are listed after the type-name
;
these do not include the name and index fields.
The form ends with the names and the initial field values for
the instances of the type.
The instances are constructed by applying the (unnamed) constructor to
these initial field values.
The name must be first and
the remaining values must match the field-tag
s in the constructor's
argument list.
(define-finite-type color :color (red green blue) color? colors color-name color-index (red color-red) (green color-green) (blue color-blue) ((black 0 0 0) (white 255 255 255) (purple 160 32 240) (maroon 176 48 96))) (color-name (color black))->
black (color-name (vector-ref colors 1))->
white (color-index (color purple))->
2 (color-red (color maroon))->
176
Previous: Records | Next: Hash tables