5

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

4

2 回答 2

1

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

请注意,如果您open同时使用模块XY,则A来自的模块Y将隐藏A来自的模块X

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

  • 毫升
  • X/a.ml
  • y.ml
  • 是/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 的问题。所以在你选择一个工具之前检查一下。

于 2012-07-15T13:35:26.313 回答
1

您不能将具有相同名称的模块链接到同一程序中。例如,标准库的扩展,如电池和核心,被迫给标准模块一个不同的名字。在电池中,列表模块称为 BatList。然后,他们提供了一个包装模块 Batteries,在该模块中,该模块通过 do 重命名module List = BatList。该模块的总体路径是Batteries.List,因此与标准库的顶层没有冲突List。最后,使用 Batteries 和 Core 的推荐方法是使用open Batteriesand open Core,从而使您可以访问模块名称下的其他列表功能List

因此,唯一的选择是重命名你的模块,但你可以通过两种方式来做到这一点:

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

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

于 2012-07-15T13:56:17.393 回答