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.
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.
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.
; 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)))