假设你有一个类型声明:
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?
}
我知道这是一件相当愚蠢的事情,但这只是我想要做的事情的一个例子。
答案 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);
}