OCaml值的表示 - 原子

4
我查看了一些OCaml值的内部表示。空数组的表示是一个atom(0),即一个标记为tag=0size=0的块。浮点数的空数组也被表示为一个atom(0)
是否有任何OCaml值由tag > 0的原子表示?如果没有:OCaml bytecode集合中包含ATOM n指令的目的是什么?

仅供统计:我检查了ocaml-4.04.0源代码树中由make world生成的所有字节码文件,并未发现任何ATOM n指令或PUSHATOM n。只有大量的ATOM0... - pifu
字节编译和字节运行代码似乎认为这是可能的,尽管我不认为它可以自然发生。也许其他生成魔法OCaml(如Coq)的语言使用了这个。我对字节码不太了解,所以我需要向同事请教。 - PatJ
1
更新:显然它从未被使用过。代码存在的原因是因为这种可能性很有趣,而且处理起来可能不需要太多的工作。也许它曾经有用过,也许将来会有用,也许某些晦涩的库依赖于该指令。它主要存在是因为“我们没有理由删除它”。由于我不确定它是否被使用过,所以我不会给出答案,但我想这可能是你能得到的最好的答案了。 - PatJ
1个回答

1

标签 > 0 用于带有参数的构造函数,这使它们不是原子。另一方面,没有参数的构造函数存储为 int 而不是块,因此也不是原子。因此,我认为不使用 atom(0)。除非...

如果有一个内联记录为空的构造函数呢?

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

似乎不允许存在空记录。我想不到其他方法来创建一个标记为零大小的块,除非直接创建这样的块。但这不会使用ATOM指令。

1
在网上搜索时,我发现了针对PIC微控制器的OCaml字节码解释器的端口。在相关论文中,作者断言没有用标签<> 0表示的原子所代表的OCaml值。 - pifu
1
并不意味着一些C代码不能创建某些东西,或者有人使用Obj模块来创建它。对于Gc和抽象类型来说,这是一个有效的事情,可能会用它来做一些事情。 - Goswin von Brederlow

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接