如何创建与C宏对应的Lisp FLI函数
我想创建一个lisp函数,它对应于C中的宏。 e、 例如,win32 API中有一个HIWORD,它在头文件中定义为宏 我试图将其定义如下,但被告知HIWORD尚未解决如何创建与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
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.