どうやってDLLを使っているのか

 と言うメモ。dllを取り込めるって言うけど実際dllを取り込んだようなの作っているのって結構少ない。migemo.lでmigemoのdllをどういう感じで読んでいるのかを見ることに。

;;migemo.l
(defvar *migemo-dll* "migemo.dll")
(c:define-dll-entry
  (c:void *) migemo-open-func ((c:char *)) *migemo-dll* "migemo_open")

define-dll-entryの中身は

;;foreign.l
(defmacro define-dll-entry (return-type name (&rest args) dll-name &optional export-name)
  `(defun ,name (&rest args)
     (setf (symbol-function ',name)
	   (si:make-c-function (si:load-dll-module ,dll-name)
			       ',(or export-name (symbol-name name))
			       ',(mapcar #'c-argument-type args)
			       ',(c-return-type return-type)))
     (apply #',name args)))

眺めた感じだとdefine-dll-entryで定義したらdefunにdllの中身を定義できるみたい。si:make-c-functionの引数がよく分からないけど。

si:make-c-function(dllの名前 取り出した関数の名前? 引数 戻り値)
define-dll-entry (return-type name (&rest args) dll-name &optional export-name)

見たいな感じなのかなぁと勝手に思った。