2014-05-05 48 views
3

的總和型比方說,你有一個類型聲明:創建C實現OCaml的功能

type foo = Bar | Baz of int 

你將如何實現一個C function創建巴茲?比方說,我聲明它是這樣的:

external create_baz : int -> foo = "create_baz" 

那我就需要填寫驗證碼:

CAMLprim value create_baz(value bar) { 
    // what do I do here? 
} 

我明白,這是做一個相當愚蠢的事情,但它只是和實例我正在嘗試做什麼。

回答

2

這在Chapter 19 of the OCaml manual中描述。

基本上,構造函數在兩個單獨的序列中按順序編號。空值構造函數(不帶值的那些,如Bar)按一個序列編號,並且構造函數採用值(如Baz)在第二個序列中編號。因此,兩個構造函數的編號都是0.

空值構造函數由立即值(表示值類似於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); 
} 
+0

哪一部分,告訴它,它是一個「巴茲」? – brooks94

+0

關於C中變體的另一個閱讀,http://www.linux-nantes.org/~fmonnier/ocaml/ocaml-wrapping-c.html#ref_enums – nlucaroni

+0

結果是塊的事實表明它是構造函數之一這需要一個價值。標籤爲0的事實表明它是帶*值的第一個*構造函數。因此,'巴茲'。參見第19.3.4節。 –