2017-04-22 41 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!