常见的lisp,CFFI和实例化c结构

我一直在谷歌上,约3小时寻找解决这个“问题”的解决方案。 我试图弄清楚如何使用CFFI在lisp中实例化C结构。 我在c中有一个结构:

struct cpVect{cpFloat x,y;} 

简单吧? 我有自动生成的CFFI绑定(swig,我认为)到这个结构:

 (cffi:defcstruct #.(chipmunk-lispify "cpVect" 'classname) (#.(chipmunk-lispify "x" 'slotname) :double) (#.(chipmunk-lispify "y" 'slotname) :double)) 

这会生成一个带有插槽的结构“VECT”:X和:Y,外部插槽名称确认(请注意我既没有生成绑定也没有编写C库(chipmunk physics),但实际的函数是从lisp调用的正好)。

我已经搜索了很多,也许我已经看过它100次并且掩盖了它,但我无法弄清楚如何在lisp中创建一个cpVect实例以用于其他function。

注意function:

 cpShape *cpPolyShapeNew(cpBody *body, int numVerts, cpVect *verts, cpVect offset) 

不仅需要一个cpVect,还需要一个指向一组cpVects的指针,这让我想到了第二个问题:如何创建指向一组结构的指针?

我去过http://common-lisp.net/project/cffi/manual/html_node/defcstruct.html并尝试了代码,但得到“错误:未绑定变量:PTR”(我在Clozure CL中),更不用说看起来只返回一个指针,而不是一个实例。

我是lisp的新手,到目前为止一直非常强大,但这是我遇到的第一个真正的问题,我无法弄明白。 谢谢!

大多数Common Lisp实现都不允许在堆栈上传递结构。 有一个fsbv库 ,它使用libffi来添加该function。 如果你知道结构布局,你可以手动将其分解为一系列基本参数,但这显然是脆弱的。

不确定这会有多大帮助,但你可以看一下针对花栗鼠的rubyFFI绑定: https : //github.com/shawn42/chipmunk-ffi/blob/master/lib/chipmunk-ffi/vec2.rb

Chipmunk有一个数据部分,它具有所有内联方法调用,因此FFI可以使用它们。 其中一个叫做cpv。 cpv是创建cpVect结构的方法。 随意在github w / me(shawn42)上开始讨论这个问题。