3.10 Enumerations and Masks
Although the constructors below are describes as procedures, they are
implemented as syntax, so that error messages can report a type name
where the syntactic context implies one.
Takes a list of symbols and generates an enumeration type. The
enumeration maps between a symbol in the given symbols list and
corresponding integers, counting from 0.
The list symbols can also set the values of symbols by
putting '= and an exact integer after the symbol. For
example, the list '(x y = 10 z) maps 'x to
0, 'y to 10, and 'z to
11.
The basetype argument specifies the base type to use.
The unknown argument specifies the result of converting an
unknown integer from the foreign side: it can be a one-argument function
to be applied on the integer, or a value to return instead. The default
is to throw an exception.
Examples: |
; example from snappy-c.h | > (define _snappy_status | (_enum '(ok = 0 | invalid_input | buffer_too_small))) |
| |
|
Similar to
_enum, but the resulting mapping translates a list
of symbols to a number and back, using
bitwise-ior on the
values of individual symbols, where A single symbol is equivalent to a
list containing just the symbol.
When a symbol does not have a given value (via '= after the
symbol in symbols), its value is the next power of 2 greater
than the previous symbol’s assignment (or 1 for the first
symbol).
The default basetype is _uint, since high bits are
often used for flags.
Examples: |
; example from curl.h | > (define _curl_global_flag | (_bitmask `(CURL_GLOBAL_SSL = 1 | CURL_GLOBAL_WIN32 = 2 | CURL_GLOBAL_ALL = 3 | CURL_GLOBAL_NOTHING = 0 | CURL_GLOBAL_DEFAULT = 3 | CURL_GLOBAL_ACK_EINTR = 4))) |
| | ; example from XOrg | > (define _Modifiers | (_bitmask '(ShiftMask = 1 | LockMask = 2 | ControlMask = 4 | Mod1Mask = 8 | Mod2Mask = 16 | Mod3Mask = 32 | Mod4Mask = 64 | Mod5Mask = 128 | Button1Mask = 256 | Button2Mask = 512 | Button3Mask = 1024 | Button4Mask = 2048 | Button5Mask = 4096 | Any = 32768))) |
| |
|