[英]Create sum type in C implementation of OCaml function
假设你有一个类型声明:
type foo = Bar | Baz of int
你如何实现一个C函数来创建一个Baz? 比方说我这样声明:
external create_baz : int -> foo = "create_baz"
然后我需要填写这段代码:
CAMLprim value create_baz(value bar) {
// what do I do here?
}
我知道这是一件相当愚蠢的事情,但这只是我想要做的事情的一个例子。
这在OCaml手册的第19章中有所描述。
基本上,构造函数按两个单独的顺序按顺序编号。 Nullary构造函数(那些没有值,如Bar
)在一个序列中编号,而取值(如Baz
)的构造函数在第二个序列中编号。 所以你的两个构造函数都编号为0。
Nullary构造函数由立即值表示(一个简单的位模式表示像int这样的值)。 获取值的构造函数由指向块的指针表示,这些指针具有可以存储包含值的字段。
所以,基本上你想要的功能,使大小1与0标签块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);
}
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.