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

时间:2014-05-05 22:30:46

标签: 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?
}

我知道这是一件相当愚蠢的事情,但这只是我想要做的事情的一个例子。

1 个答案:

答案 0 :(得分:3)

Chapter 19 of the OCaml manual中描述了这一点。

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

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

所以,基本上你的函数想要用标记0创建一个大小为1的块。bar保存在块的第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);
}