2009-12-11 2 views
1

Ceci est une partie d'une bibliothèque wrapper-système plt:En utilisant _bitmask de PltScheme IFF

(define InputMask 

    (_bitmask '(NoEventMask =   #x00000000 

      KeyPressMask =    #x00000001 

      KeyReleaseMask =   #x00000002 

      ... 

      OwnerGrabButtonMask =  #x01000000) 

     _long)) 

La chose est que je ne peux pas comprendre comment accéder à des champs dans un masque de bits (ou ENUM pour cette matière). Comment puis-je obtenir la valeur KeyPressMask par exemple?

Répondre

4

Ce n'est pas le cas. L'ajout de ctypes est simple: pour créer un nouveau ctype, vous devez fournir un ctype existant sur lequel construire, et deux fonctions - une pour traduire n'importe quel type existant, et une pour traduire l'autre.

Maintenant, le type _bitmask exactement ce que fait - il construit sur _int (mais dans votre cas, il est sur _long), et les deux fonctions de traduction traduire une liste de symboles à un nombre entier, et un entier à une liste de symboles Une fois un tel type est utilisé, vous n'avez pas besoin de connaître la valeur de KeyPressMask - vous savez juste que vous pouvez passer '(KeyPressMask) comme une entrée InputMask à la fonction étrangère, et cela sera traduit au nombre approprié; et vous savez également que lorsque vous obtenez la valeur de résultat d'une fonction ayant une sortie InputMask, il s'agit alors d'une liste de symboles pouvant contenir KeyPressMask. En bout de ligne, du côté Scheme, vous ne traitez pas de nombres, mais seulement des listes de symboles.

Si vous avez besoin d'accéder à ces valeurs pour une raison obscure, vous pouvez construire votre propre ctype d'une autre manière - en utilisant make-ctype (comme je l'ai indiqué ci-dessus) devrait être très facile.

+0

Merci! J'ai essayé 'KeyPressMask sans parenthèses (idiot moi :)) Je pourrais manquer une partie où cela est expliqué dans docs, mais je suis sûr qu'il n'est pas expliqué sur la page "Enumerations and Masks". – Slartibartfast

+0

Eh bien, les documents pour cela dit: "le mappage résultant traduit une * liste de symboles * en un nombre et retour". En tout cas, si vous avez une idée pour un phrasé plus évident je le commettrai. (Les docs étrangers pourraient utiliser quelques éclaircissements en général ...) –