この「問題」の解決策を探して、約 3 時間、Google で検索しました。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))
これにより、スロット :X および :Y を持つ構造体 "VECT" が生成されます。これは、foreign-slot-names によって確認されます (バインディングを生成したり、C ライブラリ (シマリスの物理学) をプログラムしたりしていないことに注意してください) が、実際の関数は Lisp から呼び出されています)。大丈夫です)。
私は広範囲に検索しましたが、おそらく 100 回は見たことがありますが、他の関数で使用するために Lisp で cpVect のインスタンスを作成する方法がわかりません。
関数に注意してください。
cpShape *cpPolyShapeNew(cpBody *body, int numVerts, cpVect *verts, cpVect offset)
cpVect だけでなく、一連の cpVect へのポインターも受け取るため、2 番目の質問が発生します。構造体のセットへのポインターを作成するにはどうすればよいですか?
http://common-lisp.net/project/cffi/manual/html_node/defcstruct.htmlに行ってコードを試してみましたが、「エラー: バインドされていない変数: PTR」が表示されます (私は Clozure CL を使用しています)。言うまでもなく、インスタンスではなくポインターのみを返すように見えます。
私はLispの初心者で、これまでのところかなりうまくいっていますが、これは私が理解できない最初の本当の問題です。ありがとう!