3

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

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

2 に答える 2

6

別の言語に飛び込む必要はありません。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.
于 2016-10-17T04:47:31.047 に答える