4

我正在为具有相当复杂接口的本机库处理 haskell 绑定。它有很多结构作为其接口的一部分,我一直致力于为它们构建接口hsc2hs以及bindings-DSL帮助自动化结构绑定的包。

不过,我遇到的一个问题是包含多维数组的结构。该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

好吧,没有人想出其他任何东西,所以我会在评论中提出这个想法。我将使用#field宏而不是#array_field宏,并指定一个StorableArray可以正常工作的类型。

由于我考虑了很多,我意识到可以完全抽象出包装器,使用 GHC 7.6+ 支持的新类型级数字。我将一个名为storable-static-array的包放在一起,它采用类型级别的维度,并为Storable使用本机数组(甚至是多维数组)提供适当的实例。

仍然缺少的一件事是,我非常想找到一种方法来编写一个bindings-DSL兼容的宏,该宏会自动提取尺寸并负责正确生成它们。不过,对 中的宏进行了简短的浏览bindings-DSL,这让我确信我自己的知识还不够多。

于 2013-07-31T06:57:42.317 回答
1

#array_field宏处理任何维度的数组。文档已更新以明确显示。

Haskell 等效记录将是一个列表。偷看和戳时,该列表的元素的长度和顺序将对应于数组,因为它在 C 中被视为一维数组。因此,一个字段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 回答