2013-03-03 14 views
9

私はこの質問がかなり一般的であることを知っていて、私はさらによく尋ねる方法を知らない。OCamlプロジェクトをどのように整理すればよいですか?


私はCに多くの経験を持っていないと私はちょうど私は、JavaのようにOCamlの中で同様のことを行うことができます願っています。例えば

は、Javaに、私は通常、私はsrcフォルダとbinフォルダを持っている、(Eclipseまたは他のIDEを使用して)プロジェクトを作成します。すべてcompiledのものはbinに行きます。


こうしてスターターにとって、私は上記のように簡単なことをどうしたらいいですか?ソースファイルを分割してファイルを簡単にコンパイルするだけですか?


通常、OCamlプロジェクトファイルをどのように編成していますか?


最後の質問は、それは私がmliまたはmoduleを使うべきでしょうか? ocaml-batteries-includedmliをたくさん使っていることに気づいた。

答えて

6

OCamlコミュニティには、このテーマに関するさまざまな意見があり、実際の構造や柔軟性がどのように変わっているかによって大きく変わります。私自身は怠け者であればmakefileとocamlbuildを使用し、他のものについてはoasisを使用します。あなたはいくつかのランダムなOCamlプロジェクトをチェックして、それがどのように動作し、何を望むかを確認する必要があります。たとえば、オアシスプロジェクトは、次のようになります。https://github.com/avsm/ocaml-github。 _oasisファイルを見るだけで済みます(mavenを使ったことがある場合は、pom.xmlのように考えてください)。 oasis setupを実行すると、すべてのビルドファイルが生成されます。 ocaml setup.ml -allの後にocaml setup.ml -installと入力すると、ライブラリがシステムにインストールされます。

mliを使用しています。彼らには少しの論争があります。メーリングリストの話題は次のとおりです。http://www.mentby.com/Group/caml-list/why-should-i-use-mli-files.html

私の意見では、あなたのモジュールが他の人が使うパブリックAPIの一部でない限り、それらはオプションです。どちらの場合でも必須です。

7

良い質問! は、私は他の回答を見ることに本当に興味があるが、ここで私は私のプロジェクトを整理する方法であるだろう。

まず第一に、私は優れたOCalIDEでEclipseを使用し、それを積極的に維持し、本当にクールなEclipseのプラグインです。
あなたがEmacsユーザーの場合は、TypeRex(これは死んでいますが、OCamlコミュニティは非常にゆっくりと移動していますので、すべての時間があります)。 あなたがVimユーザーの場合、Omletは常に存在しますが、本当に素晴らしい解決策はありません。

Eclipseでは、「Managed Ocaml Project」を選択することができます。基本的にはを意味します。私はこのようなプロジェクトをコンパイルすることを心配したくありません。
それから、個人的なプロジェクトや一時的なテストには十分です。しかし、あなたが「Ocaml Makefile Project」と「ocamlbuildを使ってOcamlプロジェクト」のどちらかを選択しなければならない場合は、 Makefileを選択すると、はるかに柔軟で簡単な解決方法です。

Eclipseはあなたにa default Makefile for Ocaml projectsというコメントを説明します。 Ocamlビルドシステムに精通していない場合には、これを使用することをお勧めします。もしあなたがそうであれば、私はあなた自身のMakefileを使うことをお勧めします。なぜなら、デフォルトのものが大きすぎて読めない(私は思う)からです。


素晴らしい!今私たちは好きなエディタでプロジェクトを行い、グローバルな構造を作る準備ができました!プロジェクトのルートに

は、私が言った、古典的なGNU tarボールの慣例に従う:

/ 
|- src/  # source files 
|- lib/  # dependencies 
|- test/ # tests files and test binaries 
|- _build/ # binaries and object files, sometimes managed by ocamlbuild 
|- AUTHORS # who did that marvelous stuff 
|- README # what is it 
|- Makefile # *always* provide a Makefile, you never know... 
|- _tags # when I use ocamlbuild 
|- _oasis # when I use oasis 

は時々、何のlibディレクトリが存在しないが、それは良いことです。しかし、AUTHORとREADMEファイルはプロジェクトには静かであるため、提供するべきです。


これは退屈な部分でしたが、srcディレクトリはどうですか?

  1. OCamlモジュール式システムは、自分の容器に入れるのに非常に役立ちます。
    • 私はファンクタ以外のモジュールには内部モジュールを使用していません
    • 私は自分のモジュールを一貫して(一種のゴールデンルール)維持しています。そのため、私のモジュール名は、ほとんどがデータ型または内部状態の特定のコンテナ(javaistsがSingletonsと呼ぶもの)に関連しています
    • 私はしばしば2つまたは3つの明示的に特定のモジュールを作成します:エントリーポイント、すべての共通タイプ、一般的に使用されるすべての機能が含まれています。循環依存を避ける。私は本当に私のモジュール構造を見ることができない限り、
  2. 私はsrc/ディレクトリ内のすべてのフラットに保つ(それらがパースされ、それらはAIコンピューティングあり、それらは...ネットワークです)。 Cプロジェクトと同じ方法です。

    OCamlは簡潔な言語なので、ファイルはほとんどありません。 Cプロジェクトに関しては、ディレクトリ構造ができるだけ平坦であるようにしてください。ディレクトリはモジュール名や名前空間の一部ではないので、プログラマにとって便利です。

  3. mliの部分:実際にはプロジェクトの目標に依存します。これは私の方法です:
    • 唯一の一般的なルールは次のとおりです。 Mlisはコンパイラプログラマを助けるためにここにあります。
    • あなたのためですか? ml部分にドキュメントを作成し、型制約や大きすぎるブラウジングmlのためにmliのみを生成します。
    • あなたのプロジェクトを配布したいですか?選択肢があれば、私たちが読む最初のファイルなので、mliに文書化してください。インタフェースを生成するファイルを選択してください。おそらくいくつかは内部構造であり、それらを一般ユーザが読んでいないようにしたいかもしれません。
    • OCamlオブジェクトシステムを扱うときは、非常に手早くなるので、これらは常に必要です。私はできるだけ少数としての私のMLIを保つために満足している一般的なケースでは

ので、ゲストはすぐに知ってもいいですし、高度な内部/であるどのファイルを知っているだろう。

また、私は先に進むのを止めるタイプの制約がないので、リファクタリングに役立ちます。
テストスイートは、何も壊していないことを確認するためのものです(OUnitを参照してください。ディストリビューションはパッケージ化されている必要があります)。

これは私がすべて見るものです。誰も助けてくれることを願っています!

関連する問題