Usando _bitmask de PltScheme FFI
Pergunta
Esta é uma parte de uma biblioteca plt-scheme fardos:
(define InputMask
(_bitmask '(NoEventMask = #x00000000
KeyPressMask = #x00000001
KeyReleaseMask = #x00000002
...
OwnerGrabButtonMask = #x01000000)
_long))
A coisa é que eu não consigo descobrir como a campos de acesso em uma máscara de bits (ou enum para que o assunto). Como posso obter o valor KeyPressMask por exemplo?
Solução
Você não. Adicionando ctypes é fácil:. Para fazer uma nova ctype, você precisa fornecer um ctype para construir, e duas funções - uma para traduzir o que quer com o tipo existente, e uma para traduzir a outra maneira
Agora, o tipo _bitmask
faz exatamente isso - ele constrói em _int
(mas no seu caso, é em _long
), e as duas funções de tradução traduzir uma lista de símbolos para um inteiro, e um inteiro para uma lista de símbolos . Uma vez que tal tipo é usado, você não precisa saber o valor de KeyPressMask
- você só sabe que você pode passar '(KeyPressMask)
como uma entrada InputMask
para a função externa, e que será traduzido para o número apropriado; e você também sabe que quando você começa o valor do resultado de uma função que tem uma saída InputMask
, então será uma lista de símbolos que podem conter KeyPressMask
. A linha inferior é que no lado do Esquema você não lidar com números -. Apenas com listas de símbolos
Se você do necessidade de acesso desses valores para alguma razão obscura, então você pode construir seu próprio ctype de alguma outra maneira -. Utilizando make-ctype
(como I descrito acima) deve ser muito fácil