4

私はかなり複雑なインターフェースを持つネイティブ ライブラリの haskell バインディングに取り組んでいます。hsc2hsインターフェイスの一部として多くの構造体があり、構造体バインディングの自動化を支援するbindings-DSLパッケージと、それらへのインターフェイスの構築に取り組んできました。

ただし、私が遭遇した 1 つの問題は、多次元配列を含む構造体に関するものです。bindings-DSL ドキュメントでは、次のような構造にバインドするためのマクロについて説明しています

struct with_array {
   char v[5];
   struct test *array_pointer;
   struct test proper_array[10];
};

のようなマクロで

#starttype struct with_array
#array_field v , CChar
#field array_pointer , Ptr <test>
#array_field proper_array , <test>
#stoptype

しかし、このライブラリには、フィールドとして多次元配列を持つ多くの構造体があります。

struct with_multidimensional_array {
   int whatever;
   struct something big_array[10][25][500];
};

#array_fieldマクロは、配列の最初の次元のみを処理するようです。多次元配列を扱うためのマクロがないbindings-DSLだけですか?

StorableArray(おそらく多次元の) 配列を任意のインデックスにバインドするためのマクロが本当に欲しいです。必要な情報はマクロbindings-DSLが提供しているように見えます-これにはマクロがありません。

にマクロを追加した人はいますbindings-DSLか? これにマクロを追加した人はいbindings-DSLますか?でやるべきことをhsc2hsはるかに超えていますか?もっと簡潔な方法でやりたいことをするのに役立つツールが他にありますか?

4

2 に答える 2

1

この#array_fieldマクロは、任意の次元の配列を処理します。ドキュメントが更新され、明示的に示されています。

Haskell の同等のレコードはリストになります。覗いて突っついたとき、そのリストの要素の長さと順序は、C では 1 次元配列と見なされていた配列に対応します。したがって、フィールドint example[2][3]は、6 つの要素が のように並べられたリストに対応しexample[0][0], example[0][1], example[0][2], example[1][0], example[1][1], example[1][2]ます。突くとき、リストに6つ以上の要素がある場合、最初の6つだけが使用されます。

この設計は、FFI 標準ライブラリの peekArray および pokeArray との一貫性のために選択されました。のバージョン 1.0.17 より前bindings-DSLでは、配列フィールドの次元が 1 より大きい場合にリストのサイズが過小評価されるバグがありました。

于 2013-09-02T22:00:51.817 に答える
1

ええと、誰も他に何も考え出していないので、私のコメントでその考えに行きます. #fieldマクロの代わりにマクロを使用し、正しく動作する#array_fieldようにラップする型を指定します。StorableArray

これについてかなり考えていたので、GHC 7.6+ がサポートする新しい型レベルの数値を使用して、ラッパーを完全に抽象化できることに気付きました。型レベルで次元を取り、ネイティブ配列 (多次元配列であっても) を操作するための適切なインスタンスを提供する、 storable-static-arrayというパッケージをまとめました。Storable

まだ不足していることの 1 つは、私が大いに望んでいることですが、bindings-DSL寸法を自動的に抽出して適切に生成する互換性のあるマクロを作成する方法を見つけることです。しかし、のマクロをざっと見ただけで、bindings-DSL自分でそれを管理するにはほとんど知識がないことがわかりました。

于 2013-07-31T06:57:42.317 に答える