gpt4 book ai didi

用于 C 递归结构和联合的 Haskell FFI

转载 作者:行者123 更新时间:2023-12-02 17:22:39 25 4
gpt4 key购买 nike

我正在尝试为某些 C 结构编写 Haskell FFI 绑定(bind)。示例如下:

typedef struct s0{int a; 
union{unsigned char b;
struct s0*c;
struct{unsigned char d[1];
}; };}*S;

我的问题是如何在chs(对于c2hs)或hsc(对于hsc2hs)中编写它的绑定(bind)em>) 格式?我查看了 c2hs 教程,但要么没有获得足够的信息,要么没有理解它,这本来可以帮助我编写上述定义的 chs 文件。

我可以使用 HSFFIG 工具生成 haskell 绑定(bind),但它使用自定义访问方法 HSFFIG.FieldAccess.FieldAccess 来定义绑定(bind)。我更喜欢编写使用核心 haskell FFI 库的绑定(bind),而不是第三方库。

因此,这个问题是关于如何以 hsc 格式或仅使用核心 FFI 库的 chs 格式编写上述递归结构的绑定(bind)。

实际的定义更复杂,但是一旦我弄清楚如何为 c2hs 或 hsc2hs 工具编写上述结构定义,我就可以从那里开始。我知道也需要为内部联合和结构定义可存储实例,但我不知道如何为上面的递归定义编写包装器。特别是,如何从外部结构访问内部结构/联合?我查看了 HSFFIG 定义,但访问方法是 HSFFIG 定义的访问方法。因此,我无法弄清楚如何将其转换为仅使用核心 FFI 库的 chs 定义。

我在 StackOverflow 中看到的问题似乎是关于更简单的定义。如果其他地方有类似的答案,我将不胜感激。

最佳答案

您无法在 c2hs 或 hsc2hs 中魔术般地构造出等效数据结构。但是,您只需做一点工作就可以在 c2hs 中进行自己的编码。

data MyType = Next MyType | MyChar Char | MyString String | MyEnd

然后使用 hsc2hs 的 newtype 指针功能来声明 MyType 的指针(即 s0)。然后,使用 hsc2hs 的访问器编写一个显式函数来递归地遍历您的结构并构建您的 Haskell 结构。在每一步中,您都会测试是否命中了空指针,如果是,则返回 MyEnd (或者,根据数据编码,只需检查指示联合中类型的 int 是否为负一或其他),否则继续解析取出你拥有的任何东西,如果那个东西是一个指针,则递归地进行。

您也可以使用 hsc2hs 做几乎相同的事情。

关于用于 C 递归结构和联合的 Haskell FFI,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/8099678/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com