El uso de _bitmask PltScheme FFI
Pregunta
Esta es una parte de una biblioteca plt-esquema de envoltura:
(define InputMask
(_bitmask '(NoEventMask = #x00000000
KeyPressMask = #x00000001
KeyReleaseMask = #x00000002
...
OwnerGrabButtonMask = #x01000000)
_long))
Lo que pasa es que no puedo encontrar la manera de acceder a los campos en una máscara de bits (o de enumeración para el caso). ¿Cómo puedo obtener el valor KeyPressMask por ejemplo?
Solución
No puedes. Añadiendo ctypes es fácil:. Para hacer una nueva ctype, es necesario proporcionar una ctype existente para construir, y dos funciones - uno de traducir lo que sea con el tipo existente, y uno de traducir a la inversa
Ahora, el tipo _bitmask
hace justamente eso - que se basa en _int
(pero en su caso, está en _long
), y las dos funciones de traducción traducir una lista de símbolos en un entero, y un entero a una lista de símbolos . Una vez que se utiliza un tipo tal, que no es necesario conocer el valor de KeyPressMask
- que acaba de saber que se puede pasar '(KeyPressMask)
como una entrada a la función InputMask
extranjera, y que se traducirán al número apropiado; y también se sabe que cuando se obtiene el valor del resultado de una función que tiene una salida InputMask
, entonces será una lista de símbolos que pueden contener KeyPressMask
. La conclusión es que en el lado Esquema que no se ocupan de los números -. Sólo con listas de símbolos
Si lo necesidad de acceder a estos valores por alguna oscura razón, entonces usted puede construir su propia ctype de alguna otra manera - con ayuda de make-ctype
(como he descrito más arriba) debería ser muy fácil <. / p>