值的递归定义和对基元的字节码调用

时间:2017-04-22 17:50:48

标签: recursion ocaml bytecode primitive

我正在尝试为这些原语生成包含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;; 的递归定义具体相关。

1 个答案:

答案 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!