如何创建与C宏对应的Lisp FLI函数

如何创建与C宏对应的Lisp FLI函数,lisp,c-preprocessor,common-lisp,ffi,lispworks,Lisp,C Preprocessor,Common Lisp,Ffi,Lispworks,我想创建一个lisp函数,它对应于C中的宏。 e、 例如,win32 API中有一个HIWORD,它在头文件中定义为宏 我试图将其定义如下,但被告知HIWORD尚未解决 CL-USER 4 > (hiword #xFFFFFFFF) Error: Foreign function HIWORD trying to call to unresolved external function "HIWORDW". 我只是想知道如何为C宏创建一个包装器,就像为C函数创建包装器一样 (fli:de

我想创建一个lisp函数,它对应于C中的宏。 e、 例如,win32 API中有一个HIWORD,它在头文件中定义为宏

我试图将其定义如下,但被告知HIWORD尚未解决

CL-USER 4 > (hiword #xFFFFFFFF)
Error: Foreign function HIWORD trying to call to unresolved external function "HIWORDW".
我只是想知道如何为C宏创建一个包装器,就像为C函数创建包装器一样

(fli:define-c-typedef DWORD (:unsigned :long))
(fli:define-c-typedef WORD (:unsigned :short))

(fli:define-foreign-function
        (HIWORD "HIWORD" :dbcs)
        ((dwVal dword))
        :result-type word :calling-convention :stdcall)

你不能直接这样做。编译过程中不保留C预处理器宏,即生成的目标文件中没有与C宏本身相对应的工件(尽管其扩展可能多次成为目标文件的一部分)。既然没有人工制品,就没有任何东西可以与FFI绑定

但是,您可以提供一个包装器函数

#define HIGHWORD(x)     /* whatever */

int 
highword_wrapper(int x)
{
    return HIGHWORD(x);
}

这个可以和外国金融机构一起使用。

无需跳转到另一种语言。Lisp中的移位和掩蔽:

(defun hiword (val)
  (logand (ash val -16) #xFFFF)

(defun loword (val) ;; ditto
  (logand val #xFFFF))
另一种方法:使用
ldb
访问器,其范围使用
byte
语法表示:

(defun hiword (val)
  (ldb (byte 16 16) val)  ;; get 16-bit-wide "byte" starting at bit 16.

(defun loword (val)
  (ldb (byte 16 0) val)   ;; get 16-bit-wide "byte" at position 0.