簡體   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