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