Tag: common lisp

常见的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的新手,到目前为止一直非常强大,但这是我遇到的第一个真正的问题,我无法弄明白。 谢谢!

用cffi-libffi按值传递结构?

我的印象是CFFI无法通过值传递结构,但CFFI文档说: 要按值传递或返回结构到函数,请加载cffi-libffi系统并将结构指定为(:struct structure-name) 。 要传递或返回指针,可以使用:pointer或(:pointer (:struct structure-name)) 。 我正在重新包装cl-opencv函数get-size ,它是这个opencv函数的包装器: CvSize cvGetSize(const CvArr* arr) 因为我不认为当cl-opencv的作者编写库时,CFFI能够通过cffi-libffi系统按值传递结构,所以他必须使用以下所有代码来包装cvGetSize : (defmacro make-structure-serializers (struct slot1 slot2) “Create a serialization and deserialization function for the structure STRUCT with integer slots SLOT1 and SLOT2. These functions will pack and unpack the structure into an INT64.” (let ((pack-fn (intern (concatenate ‘string (string struct) […]

Lisp中C结构的惯用等价物是什么?

在C类语言中,从一开始就在每本入门书中都强调结构/记录和对象。 然后,他们的完整系统围绕管理这些结构,它们的相互关系和inheritance而设计。 在Lisp文档中,你通常可以找到1-2页关于Lisp“也”如何有一个defstruct,一个简单的例子,通常就是这样。 而且,根本没有提到结构的嵌套。 对于来自C背景的人来说,首先看来,分层组织不同的数据类型不是Lisp中的首选方法,但除了CLOS之外,CLOS是一个完整的对象系统,如果你只是想要结构,那就太复杂了,除了疯狂一切之外在列表中,没有明显的方法来转移您的C结构知识。 什么是层次组织数据的惯用Lisp方法,最类似于C结构? – 我认为我的问题的总结答案是:对于初学者学习目的,可以使用defstruct和/或plists,虽然“遗留特征”,因为它们最接近C结构,但是它们已经被更多地取代了灵活的defclass / CLOS,这是大多数Lisp程序今天使用的。 这是我关于SO的第一个问题,所以感谢大家的回答。