我正在尝试为这些原语生成包含WrappedFunction1[B, C]
的OCaml字节码:
C_CALL
这些都与递归定义值有关(参见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;;
的递归定义具体相关。
答案 0 :(得分: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!