繁体   English   中英

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

[英]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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM