Common lisp 如何将DEFCFUN与指向外部C函数的指针一起使用?
我正在使用CFFI与使用GLib的库进行交互。GLib中的函数具有以下特征: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
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。
为此,需要定义一个Lispfree
函数作为回调函数,并让它调用本机函数
(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指针或丢失
,函数是否已重命名为其他名称?我通过查看源代码找到了它,我现在不确定符号是否已导出。