2016-10-16 12 views
3

Cのマクロに対応するlisp関数を作成したいと思います。 たとえば、ヘッダにマクロとして定義されているHIWORDがwin32 APIにありますファイル。Cマクロに対応するLisp FLI関数を作成する方法

私は以下のように定義しようとしましたが、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) 

答えて

6

別の言語にジャンプする必要はありません。 Lispでのシフトとマスキング:

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

(defun loword (val) ;; ditto 
    (logand val #xFFFF)) 

別の方法:右、

(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. 
+0

HIWORDがあるべき(-16灰のval):ldbアクセサを使用して範囲がbyte構文を使用して表現して? – user1461328

+0

@ user1461328それは正しいです。 – Kaz

7

これは直接行うことはできません。 Cプリプロセッサ・マクロは、コンパイル・プロセスでは保存されない。すなわち、生成されたオブジェクト・ファイルには、Cマクロ自体に対応するアーチファクトはない(その拡張は、オブジェクト・ファイルの複数の部分であってもよい)。アーティファクトがないので、FFIとバインドするものはありません。

ただし、

#define HIGHWORD(x)  /* whatever */ 

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

ラッパー関数を提供することができ、これはFFIで使用することができます。

関連する問題