2017-02-27 13 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來說這是一個有效的東西,而抽象類型可以很好地用於某些事情。 –