常见的LISP,CFFI和实例化C结构
-
14-10-2019 - |
题
我在Google上呆了大约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))
这会生成一个带有插槽的struct“ vect”:x and:y,外国插槽名称确认的(请注意,我既不会生成绑定或编程C库(chipmunk Physics),但是从LISP调用了实际功能正好)。
我已经搜索了很广泛的搜索,也许我已经看到了100次并在它上掩盖了它,但是我不知道如何在LISP中创建CPVECT实例以在其他功能中使用。
注意功能:
cpShape *cpPolyShapeNew(cpBody *body, int numVerts, cpVect *verts, cpVect offset)
不仅要采用一个CPVECT,还可以指向一组CPVECT的指针,这使我陷入了第二个问题:如何创建指向一组结构的指针?
我去过 http://common-lisp.net/project/cffi/manual/html_node/defcStruct.html 并尝试了代码,但要获得“错误:未结合变量:ptr”(我在clozure cl中),更不用说看起来只返回指针而不是实例。
我是LISP的新手,到目前为止一直很强,但这是我遇到的第一个真正的问题,我无法弄清楚。谢谢!
解决方案
最常见的LISP实现不允许在堆栈上传递结构。有一个 FSBV库 它使用libffi添加了该功能。如果您知道结构布局,则可以将其作为一系列基本参数手动分解,但这显然很脆。
其他提示
不确定这会有所帮助,但是您可以查看chipmunk的Ruby FFI绑定:https://github.com/shawn42/chipmunk-ffi/blob/master/lib/chipmunk-ffi/vec2.rb
Chipmunk的数据部分具有所有内联方法调用,因此FFI可以使用它们。其中之一称为CPV。 CPV是创建CPVECT结构的方法。随时在Github(Shawn42)上启动有关此的对话。