2017-02-27 3 views
4

いくつかのOCaml値の内部表現を見ました。空の配列の表現はatom(0)、すなわちtag=0size=0のブロックです。浮動小数点の空の配列はatom(0)でも表されます。値のOcaml表現 - Atoms

アトムで表されるOCaml値はtag > 0ですか?そうでない場合:OCamlバイトコードセットにはどのような目的のためにATOM n命令が含まれていますか?

+0

ocaml-4.04.0ソースツリーで 'make world'が生成したすべてのバイトコードファイルを検査しました。' ATOM n'命令も 'PUSHATOM n'も見つかりませんでした。 'ATOM0'の多くは... – pifu

+0

bytecompとbyterunコードは、自然に起こるとは思えませんが、これが可能だと思っているようです。おそらく、Coqのような魔法のOCamlを生成する他の言語がこれを使用します。私はバイトコードについてよく知らないので、同僚と確認する必要があります。 – PatJ

+1

更新:明らかに使用されていません。このコードは、可能性が面白かったために存在し、おそらく処理するために多くの作業を必要としませんでした。たぶん役立つかもしれませんが、多分それはいつか役に立つかもしれません、多分いくつかのあいまいな図書館はその指示に依存しています。それは主に「我々はそれを取り除く理由がない」ために存在する。私はそれが使用されていないことを私は確信していないので、私は答えをつけるつもりはないが、私はあなたが得る最高だと思う。 – PatJ

答えて

1

引数を持つコンストラクタにはタグ> 0が使用され、アトムではありません。一方、引数のないコンストラクタはブロックではなくintとして格納されるため、アトムではありません。ですから、私はatom(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)では、タグ<> 0のアトムで表されるOCaml値は存在しないと主張している。 – pifu

+1

いくつかのCコードが一部を作成しないか、Objモジュールを使ってコードを作成することを意味します。それはGcのための有効なものであり、抽象型は何かのためにそれをうまく使うことができます。 –