|Version 8 (modified by cowan, 2 months ago) (diff)|
THIS IS NOT A PROPOSAL. It's just a dumping ground for some stuff I don't want to lose track of. There will be a proper proposal later.
Based on unique objects, not symbols.
Each enum object has four properties: enum type, name (a symbol), ordinal (a non-negative exact integer), value (anything). Enum objects are unique across enum types. Names and ordinals are unique within an enum type. Accessors are enum-type, enum-name, enum-ordinal, enum-value.
An enum type contains a map from names to enum objects and a vector indexed by the ordinal. We need enum-ordinal->enum (uses the vector) and enum-name->enum (uses the map) as fundamental procedures on enum types. Simple composition gives us enum-name->ordinal, enum-ordinal->name, enum-ordinal->value, and enum->name->value. There is no way to work backward from an enum value because it need not be unique. To step from one enum to another, enum-next and enum-prev. To start somewhere, enum-min and enum-max.
Having a single value is very handy for C definitions, etc.
Operations over the whole enum-type: enum-type-size, enum-type-enums and enum-type-names. Maybe enum-type-values as well.
Make-enumeration-type accepts either names or (name value) lists. Ordinals are assigned in order from 0 upward; values default to same as ordinals. Define-enumeration-type binds an identifier to the enumeration type and an identifier per enum (the type name plus a hyphen plus the enum name) to each enum.
Comparisons: enum=?, enum<?, enum>?, enum<=?, enum>=?.
Except as noted below, the procedures for creating and manipulating enumeration sets are the same as those for sets, except that set is replaced by enum-set in their names. Wherever a newly allocated enumeration set is returned, it has the same enumeration type as the source sets. It is an error to operate on enumeration sets of different types in a single procedure.
Returns a newly allocated enumeration set. The possible elements of the set are the enum objects in enum-type. The set contains all possible elements. The approximate R6RS equivalent is enum-set-universe.
(enum-set enum-type element ...)
Returns a newly allocated enumeration set. The possible elements of the set are the symbols in enum-type. The set is initialized to contain the elements. There is no R6RS equivalent.
(list->enum-set enum-type list)
Returns a newly allocated enumeration set. The possible elements of the set are the symbols in enum-type. The set is initialized to contain the elements of list. There is no R6RS equivalent.
Returns a newly allocated enumeration set that is the complement of enum-set. This procedure is also in R6RS.
(enum-set-projection enum-set enum-type)
Returns a newly allocated enumeration set of type enum-type. Its elements are the enum objects in enum-type which have the same names as members of enum-set. Enum objects without corresponding names are ignored. This procedure is also in R6RS, but uses a second enum-set in place of enum-type.
There will probably be more, depending on how integer sets turn out: enum-set-complement, enum-set-complement!, enum-set-min, enum-set-max.
Based on vectors indexed by the enum's ordinal. Procedures:
Constructors enum-type->enum-map enum-map-unfold Predicates enum-map? enum-map-contains? enum-map=? Accessors enum-map-ref enum-map-ref/default Mutators enum-map-set! enum-map-set-entries! enum-map-delete! enum-map-delete-keys! enum-map-push! enum-map-pop! enum-map-search! enum-map-clear! The whole enum map enum-map-size enum-map-keys enum-map-values enum-map-entries enum-map-find enum-map-count enum-map-any enum-map-every enum-map-map enum-map-map-values enum-map-for-each enum-map-map! enum-map-collect enum-map-fold enum-map-filter! enum-map-remove! Copying and conversion enum-map-copy enum-map->alist Enum maps as functions enum-map-accessor enum-map-accessor/default enum-map-union enum-map-intersection enum-map-difference enum-map-xor Comparators enum-map-comparator make-enum-map-comparator