在 OCaml 函数的 C 实现中创建求和类型

标签 c ocaml ml

假设您有一个类型声明:

type foo = Bar | Baz of int

您将如何实现 C function创建一个 Baz?假设我这样声明:

external create_baz : int -> foo = "create_baz"

然后我需要填写这个代码:

CAMLprim value create_baz(value bar) {
  // what do I do here?
}

我知道这是一件相当愚蠢的事情,但这只是我正在尝试做的事情的一个例子。

最佳答案

这在 Chapter 19 of the OCaml manual 中有描述.

基本上,构造函数在两个单独的序列中按顺序编号。 Nullary 构造函数(不带值的构造函数,如 Bar)按一个序列编号,带值的构造函数(如 Baz)按第二序列编号。所以你的两个构造函数都编号为 0。

Nullary 构造函数由立即值表示(表示类似 int 的值的简单位模式)。取值的构造函数由指向 block 的指针表示, block 具有可以存储所含值的字段。

所以,基本上您的函数想要创建一个大小为 1 且标记为 0 的 block 。bar 保存在 block 的第 0 个字段(唯一的字段)中。

看起来像这样:

value create_baz(value bar) {
    // Caller guarantees that bar is an int.
    //
    CAMLparam1(bar);
    CAMLlocal1(result);
    result = caml_alloc(1, 0);
    Store_field(result, 0, bar);
    CAMLreturn(result);
}

关于在 OCaml 函数的 C 实现中创建求和类型,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/23482995/

相关文章:

c - 如何通过引用将创建的指针数组传递到结构中?

创建在另一个头文件中定义的结构数组

ocaml - 比较 float 列表

algorithm - 如何在给定解析图的情况下完成 ML 类型推理算法

types - 标准 ML 中的自引用记录类型

windows - 在 Windows 上运行标准机器学习

arrays - 将某些内容添加到链接列表时,列表中的其他项目采用最后添加的项目的名称

在 C 中检查正在运行的进程

multithreading - OCaml 错误 : Unbound module Event

ocaml - 如何在 OCaml 中使用断言?