使用PltScheme FFI的_bitmask

时间:2009-12-11 21:02:59

标签: scheme racket bitmask ffi

这是plt-scheme包装器库的一部分:

(define InputMask

  (_bitmask '(NoEventMask =            #x00000000

            KeyPressMask =             #x00000001

            KeyReleaseMask =           #x00000002

            ...

            OwnerGrabButtonMask =      #x01000000)

      _long))

问题是我无法弄清楚如何访问位掩码中的字段(或者就此而言是枚举)。我怎样才能得到KeyPressMask值?

1 个答案:

答案 0 :(得分:4)

你没有。添加ctypes很简单:要创建一个新的ctype,你需要提供一个现有的ctype来构建,还有两个函数 - 一个用于翻译现有类型,另一个用于翻译另一种方式。

现在,_bitmask类型就是这样 - 它建立在_int上(但在你的情况下,它在_long上),两个翻译函数翻译一个符号列表到一个整数,一个整数到一个符号列表。一旦使用了这样的类型,您就不需要知道KeyPressMask的值 - 您只知道可以将'(KeyPressMask)作为InputMask输入传递给外部函数,并且这将被翻译成适当的数字;并且您还知道,当您从具有InputMask输出的函数中获取结果值时,它将是可能包含KeyPressMask的符号列表。最重要的是,在方案方面,你不处理数字 - 只有符号列表。

如果需要出于某些不明原因需要访问这些值,那么您可以通过其他方式构建自己的ctype - 使用make-ctype(如上所述)应该是很容易。