2017-02-27 52 views
4

我看了一些OCaml值的内部表示。空阵列的表示是atom(0),即具有tag=0size=0的块。空阵列浮点数也由atom(0)表示。Ocaml表示值 - 原子

是否有任何由原子表示的OCaml值0123'?如果不是:为什么OCaml字节码集包含ATOM n指令?

+0

仅用于统计:我检查了ocaml-4.04.0源代码树中'make world'生成的所有字节码文件,并且没有找到'ATOM n'指令,也没有找到'PUSHATOM n'。只有很多'ATOM0' ... – pifu

+0

bytecomp和byterun代码似乎认为这是可能的,虽然我不认为它可以自然发生。也许其他生成魔法OCaml的语言(如Coq)使用这个。我不太了解字节码,所以我必须与同事核对一下。 – PatJ

+1

更新:显然它从未使用过。代码的存在是因为这种可能性很有趣,可能并不需要太多的工作来处理。也许这很有用,也许它有一天可能会有用,也许一些不起眼的图书馆依赖于该指令。它主要存在是因为“我们没有理由将其删除”。由于我不确定它没有被使用,所以我不会给出答案,但我想这是最好的。 – PatJ

回答

1

标记> 0用于带参数的构造函数,这会使它们不是原子。另一方面,不带参数的构造函数被存储为int而不是块,所以不是原子。所以我认为原子(0)没有被使用。除...

如何让内联记录为空构造函数?

# type t = A of int | B of { };; 
Error: Syntax error 

似乎空记录是不允许的。我想不出用另一种方法来创建一个带有标签的0尺寸块,而不是直接创建这样一个块。但那不会使用ATOM指令。

+0

谷歌搜索,我发现[PIC微控制器OCaml字节码解释器的端口](http://www.algo-prog.info/ocapic/web/index.php?id=ocapic)。在[相关论文](http://studia.complexica.net/Art/AC-JFLA11-07.pdf)中,作者声称没有OCAM1值由标记<> 0的原子表示。 – pifu

+1

不意味着一些C代码不会创建一些或者有人使用Obj模块来创建一个。对于Gc来说这是一个有效的东西,而抽象类型可以很好地用于某些事情。 –