2017-04-22 44 views
1

我試圖生成包含C_CALL s到這些原語OCaml的字節碼:遞歸定義調用原語來

caml_alloc_dummy 
caml_alloc_dummy_function 
caml_update_dummy 
caml_alloc_dummy_float 

它們都涉及到價值觀的遞歸定義(見<ocamlsource>/bytecomp/bytegen.ml

產生對前三次調用,這個代碼就足夠了:

let rec myval = (f, 1, myval) 
and f _ = match myval with (_, x, _) -> x;; 

,但我無法想象的一段代碼最後一個,它應該與float array的遞歸定義特別相關。

回答

2

這似乎做(與4.03.0測試):

type t = { x : float } 

let rec r = { x = 0.1 +. 0.2 } 

是的,rec是沒用的,但字節碼編譯是沒有足夠的智慧看到。請注意,每個字段都是浮點數的記錄都是特殊表示的,浮點數將被解開。

生成的字節碼:

const 1 
ccall caml_alloc_dummy_float, 1 
push 
const 0.2 
push 
const 0.1 
ccall caml_add_float, 2 
makefloatblock 1 
push 
acc 1 
ccall caml_update_dummy, 2 
event "_none_" -1--1 
acc 0 
makeblock 1, 0 
pop 1 
setglobal Test!