Common lisp 如何将DEFCFUN与指向外部C函数的指针一起使用?

Common lisp 如何将DEFCFUN与指向外部C函数的指针一起使用?,common-lisp,glib,cffi,Common Lisp,Glib,Cffi,我正在使用CFFI与使用GLib的库进行交互。GLib中的函数具有以下特征: void g_列表_free_full(GList*list, GDestroyNotify free_func); 我需要从Lisp调用这个函数,因为我正在使用一些函数,在这些函数中我需要创建GList对象,所以我还需要在以后释放它们。在C中,我会这样做(另请参见): g_-list_-free_-full(res,g_-free); 到目前为止,我的Lisp绑定如下所示: (asdf:负载系统:cffi) (d

我正在使用CFFI与使用GLib的库进行交互。GLib中的函数具有以下特征:

void
g_列表_free_full(GList*list,
GDestroyNotify free_func);
我需要从Lisp调用这个函数,因为我正在使用一些函数,在这些函数中我需要创建
GList
对象,所以我还需要在以后释放它们。在C中,我会这样做(另请参见):

g_-list_-free_-full(res,g_-free);
到目前为止,我的Lisp绑定如下所示:

(asdf:负载系统:cffi)
(defpackage:测试glib绑定
(:use:common-lisp:cffi))
(包内:测试glib绑定)
(定义外部库libglib)
(:unix(:或“libglib-2.0.so.0”“libglib-2.0.so”))
(使用外文库libglib)
(defctype gint:int)
(DefctType gboolean:布尔型)
(DefctType gpointer:指针)
(defcfun“g_free”:无效
(mem gpointer))
(defcfun“g_列表\自由\完整”:无效
(lst gpointer)
(乐趣:指针)
但是我不确定我的
defcfun
签名对于
g\u list\u free\u full()
是否正确,也不确定如何从Lisp正确调用它。我天真的猜测是:

(g-list-free-full my glist(获取回调“g-free))

但很难说这是正确的(或最好的)做事方式。我也不是一个有经验的C程序员,我不知道这在技术上是否可行,但在将来会导致其他问题。

我不确定是否为未使用
defcallback
声明的函数定义了
get callback
。这没有经过测试,但您可能只需要将库中的
“g_free”
符号解析为其指针,并将此值作为参数传递

您可以调用
fs pointer或lose
foreign symbol ptr
来获取指向本机
g_free
函数的指针;您没有调用
(get callback'g-free)
,而是编写:

(fs-pointer-or-loose "g_free")
或者,您可以使用
defcallback
callback
来返回Lisp,但代价是返回Lisp。 为此,需要定义一个Lisp
free
函数作为回调函数,并让它调用本机函数

(defcfun (g-free "g_free") :void (mem gpointer))

(defcallback free :void ((mem gpointer))
  (g-free mem))
然后,您将通过
callback
传递指向回调的指针

(g-list-free-full my-glist (callback free))

谢谢,
外来符号指针
似乎是一个合理的起点,所以我将尝试一下。但是我在CFFI文档的任何地方都没有看到
fs指针或丢失
,函数是否已重命名为其他名称?我通过查看源代码找到了它,我现在不确定符号是否已导出。