值的递归定义和对原语的字节码调用

Recursive definitions of values and bytecode calls to primitives

我正在尝试为这些基元生成包含 C_CALLs 的 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的递归定义相关的。

这似乎可以做到(用 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!