10

我知道这个问题很笼统,我什至不知道如何更好地问。


我没有太多经验C,我只是希望我可以在 OCaml 中做与在 Java 中类似的事情。

例如,在 中Java,我通常创建一个项目(使用Eclipse或其他 IDE),然后我有一个src文件夹和一个bin文件夹。所有compiled的东西都去bin


那么对于初学者来说,我怎么能做像上面这样简单的事情呢?只需拆分源文件并轻松编译文件?


通常,你们如何组织 OCaml 项目文件?


最后一个问题是我应该使用mliormodule吗?我注意到这ocaml-batteries-included使用mli了很多。

4

2 回答 2

7

OCaml 社区对这个主题有很多不同的看法,这实际上取决于您想要的结构或灵活性。如果我对其他一切都懒惰和绿洲,我自己会使用 makefile 和 ocamlbuild。你应该检查一些随机的 OCaml 项目,看看它是如何工作的以及你想要什么。例如,一个 oasis 项目可能如下所示: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 的一部分,否则它们是可选的。在这种情况下,它们是强制性的。

于 2013-03-03T17:13:00.977 回答
7

好问题!我真的很想看到其他答案,但这是我组织项目的方式:

首先,我使用 Eclipse 和优秀的OCalIDE,它是一个非常酷的 eclipse 插件,积极维护。
如果你是 Emacs 用户,你可以使用TypeRex(它已经死了,但是随着 OCaml 社区的发展非常缓慢,你有所有的时间)。如果你是 Vim 用户,总是有 Omlet,但没有任何真正好的解决方案。

使用 Eclipse,您可以选择“Managed Ocaml Project”,这意味着基本上我不想担心编译的东西,我永远不会分享这个项目
从那开始,这对于个人项目和临时测试来说已经足够了。但是如果你不能,你将不得不在“Ocaml Makefile Project”和“Ocaml project with ocamlbuild”之间进行选择。选择 Makefile,它是更加灵活和简单的解决方案。

Eclipse 将为您提供一个用于 Ocaml 项目的默认 Makefile,在评论中有很好的解释。如果您不熟悉 Ocaml 构建系统,我建议您使用它。如果是,我建议您使用自己的 Makefile,因为默认的 Makefile 太大且不可读(我认为)。


伟大的 !现在我们在我们最喜欢的编辑器中有了我们的项目,并准备好放置一个全局结构!

在项目的根部,我遵循经典 GNU tarball 的约定,即:

/
|- 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. src/除非我真的能在我的模块中看到一个结构(那些是解析,那些是人工智能计算,那些是网络......),否则我将所有内容都放在目录中。就像我对 C 项目所做的那样。

    OCaml 是一种简洁的语言,因此您应该有很少的文件。对于 C 项目,尽量保持目录架构尽可能平坦,记住目录不是模块名称或命名空间的一部分,所以它只是为了程序员的方便!

  3. mli 部分:这实际上取决于您项目的目标。这是我的方法:
    • 唯一的一般规则是:记录 mli(如果存在)。Mlis 在这里帮助编译器程序员。
    • 是给你的吗?在 ml 部分中记录并仅生成用于键入约束或太大而无法浏览 ml 的 mli。
    • 您想分发您的项目吗?在 mli 中记录,因为如果可以选择,我们将读取的第一个文件。选择您将生成界面的文件,也许有些是内部文件,您不希望它们被临时用户阅读。
    • 当您处理 OCaml 对象系统时,总是需要它们,因为它会很快变得混乱。

在一般情况下,我很乐意尽可能少地保留我的 mli,以便客人立即知道哪些文件值得了解,哪些是内部文件/高级文件。

此外,它有助于重构,因为我没有阻止我继续前进的类型约束。
请记住,测试套件的存在是为了确保我们不会破坏任何东西(请参阅OUnit,您的发行版应该已经为您打包了一个。它非常简单高效,是一个很好的项目)。

这就是我所看到的。希望对任何人都有帮助!

于 2013-03-05T23:21:32.793 回答