OCaml项目目录结构

时间:2012-07-15 13:19:03

标签: ocaml

我想在源代码树的不同目录中给两个.ml源文件同名,但是OCaml文档声明a文件A.ml被导出为顶层模块A = struct ... end。如果我有两个文件X / A.ml和Y / A.ml,我如何从B.ml中引用它们?

2 个答案:

答案 0 :(得分:1)

模块可以包含模块,即您可以拥有模块层次结构。 从B.ml的角度来看,您可以看到两个名为X.AY.A的模块。 他们甚至可以都有一个名为foo的函数,这些函数将被视为X.A.fooY.A.foo

请注意,如果您open模块XYA中的模块Y将隐藏A模块{ {1}}。

这是从命名空间的角度来看的。现在,关于源树。 一种方法是拥有这些文件:

  • x.ml
  • X / a.ml
  • y.ml
  • Y / a.ml

自动生成文件x.ml并包含以下内容:

X

同样适用于y.ml 有几个预处理器能够包含一个文件:cpp,camlp4,camlp5,camlmix ......

这组自动生成的文件(每次源更改时重新生成)都不是很令人满意,我会看看其他答案。

您还可以查看module A = struct (*The contents of x/a.ml is included here*) end ,但是很久以前我尝试使用ocamlc -pack无法获得x / a.ml和y / a.ml时出现问题。所以在你找到工具之前先检查一下。

答案 1 :(得分:1)

您无法将具有相同名称的模块链接到同一程序中。例如,标准库的扩展(例如电池和核心)被迫为标准模块提供不同的名称。在Batteries中,List模块称为BatList。然后,他们提供了一个包装模块Batteries,在其中通过module List = BatList重命名模块。此模块的总体路径为Batteries.List,因此不会与标准库的顶级List发生冲突。最后,推荐的使用电池和核心的方法是open Batteriesopen Core,这样您就可以在模块名称List下访问其他列表函数。

因此,唯一的选择是重命名模块,但您可以通过两种方式执行此操作:

  • 更改模块的基本名称,例如称他们为A和B.

  • 将模块放在另一个模块下,例如将它们命名为X.A和Y.A.如果要保留当前目录结构,可以使用OCaml的-pack选项。就个人而言,我觉得这个选项限制性太强,总是最终做手动打包,即上面描述的电池和核心技术。