Utilizzando _bitmask da PltScheme FFI
Domanda
Questa è una parte di una libreria PLT-schema di involucro:
(define InputMask
(_bitmask '(NoEventMask = #x00000000
KeyPressMask = #x00000001
KeyReleaseMask = #x00000002
...
OwnerGrabButtonMask = #x01000000)
_long))
Il fatto è che riesco a capire come accedere i campi in una maschera di bit (o enum per questo). Come posso ottenere il valore KeyPressMask per esempio?
Soluzione
Non lo sai. L'aggiunta di ctypes è facile:. Per fare una nuova ctype, è necessario fornire un ctype esistente per costruire su, e due funzioni - uno per tradurre tutto ciò al tipo esistente, e uno per tradurre l'altro modo
Ora, il tipo _bitmask
fa proprio questo - si basa sul _int
(ma nel tuo caso, è su _long
), e le due funzioni di traduzione tradurre un elenco di simboli in un intero, e un intero ad un elenco di simboli . Una volta che tale tipo viene utilizzato, non è necessario conoscere il valore di KeyPressMask
- è sufficiente sapere che è possibile passare '(KeyPressMask)
come input InputMask
alla funzione estere, e che sarà tradotto il numero appropriato; e si sa anche che quando si ottiene il valore del risultato da una funzione che dispone di un'uscita InputMask
, allora sarà un elenco di simboli che potrebbero contenere KeyPressMask
. La linea di fondo è che sul lato Scheme non trattare con i numeri -. Solo con le liste di simboli
Se do hanno bisogno di accedere a questi valori per qualche oscura ragione, allora si può costruire il proprio ctype in qualche altro modo - usando make-ctype
(come ho descritto sopra) dovrebbe essere molto facile <. / p>