ソースツリーの異なるディレクトリにある2つの.mlソースファイルに同じ名前を付けたいのですが、OCamlのドキュメントには、ファイルA.mlがトップレベルモジュールA = struct...endとしてエクスポートされると記載されています。X/A.mlとY/A.mlの2つのファイルがある場合、B.mlから両方を参照するにはどうすればよいですか?
2 に答える
モジュールにはモジュールを含めることができます。つまり、モジュールの階層を持つことができます。B.mlの観点から、とという名前の2つのモジュールを見ることができX.A
ますY.A
。それらは両方ともという名前の関数を持つことができfoo
、それらの関数はととして見られX.A.foo
ますY.A.foo
。
モジュールとのopen
両方を使用する場合、からのモジュールはからのモジュールを非表示にすることに注意してください。X
Y
A
Y
A
X
それは名前空間の観点からでした。さて、ソースツリーについて。1つの方法は、これらのファイルを用意することです。
- x.ml
- X / a.ml
- y.ml
- y / a.ml
ファイルx.mlは自動的に生成され、次のものだけが含まれます。
module A = struct
(*The contents of x/a.ml is included here*)
end
同様にy.mlの場合、ファイルを含めることができるいくつかのプリプロセッサがあります:cpp、camlp4、camlp5、camlmix ...
この自動生成されたファイルのセット(およびソースが変更されるたびに再生成される)は、あまり満足のいくものではありません。他の回答を見ていきます。
もご覧いただけますocamlc -pack
が、ずっと前に試してみたところ、ocamldoc
x/a.mlとy/a.mlが持てないという問題がありました。したがって、ツールを決定する前にこれを確認してください。
同じ名前のモジュールを同じプログラムにリンクすることはできません。たとえば、BatteriesやCoreなどの標準ライブラリの拡張機能では、標準モジュールに別の名前を付ける必要があります。バッテリーでは、ListモジュールはBatListと呼ばれます。次に、ラッパーモジュールのバッテリーを提供します。このバッテリー内で、を実行してモジュールの名前を変更しmodule List = BatList
ます。このモジュールへの全体的なパスはBatteries.List
であるため、標準ライブラリのトップレベルとの衝突はありませんList
。最後に、Batteries and Coreを使用するための推奨される方法は、open Batteries
andを実行open Core
することです。これにより、モジュール名で追加のリスト機能にアクセスできるようになりますList
。
したがって、唯一のオプションはモジュールの名前を変更することですが、これは2つの方法で行うことができます。
モジュールのベース名を変更します。たとえば、モジュールをAおよびBと呼びます。
モジュールを別のモジュールの下に置きます。たとえば、XAとYAという名前を付けます。現在のディレクトリ構造を維持したい場合は、OCamlの-packオプションを使用できます。個人的には、このオプションは制限が厳しすぎて、常に手動でパッキングすることになります。つまり、BatteriesandCoreで使用されている上記の手法です。