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

Recursion 值的递归定义和对原语的字节码调用,recursion,ocaml,bytecode,primitive,Recursion,Ocaml,Bytecode,Primitive,我正在尝试生成OCaml字节码,其中包含对这些原语的C\u调用s: caml_alloc_dummy caml_alloc_dummy_function caml_update_dummy caml_alloc_dummy_float 它们都与值的递归定义有关(请参见/bytecomp/bytegen.ml) 要生成对前三个的调用,以下代码就足够了: let rec myval = (f, 1, myval) and f _ = match myval with (_, x, _) ->

我正在尝试生成OCaml字节码,其中包含对这些原语的
C\u调用
s:

caml_alloc_dummy
caml_alloc_dummy_function
caml_update_dummy
caml_alloc_dummy_float
它们都与值的递归定义有关(请参见
/bytecomp/bytegen.ml

要生成对前三个的调用,以下代码就足够了:

let rec myval = (f, 1, myval)
and f _ = match myval with (_, x, _) -> x;;
但我无法想象最后一段代码,它应该与
float array
s的递归定义具体相关。

这似乎可以做到(使用4.03.0进行测试):

是的,
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!
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!