如何将多个 OCaml 文件加载到顶层?

How to load multiple OCaml files into toplevel?

我正在尝试调试我制作的程序。这是我的目录结构:

src
 |- module1.ml
 |- section1
     |- module2.ml
     |- module3.ml

module1.ml 被 module2.ml 和 module3.ml 引用。 module2.ml 被 module3.ml 引用。

我尝试使用命令将文件加载到顶层

ocaml -I section1 module1.ml section1/module2.ml section1/module3.ml

但它不起作用。它甚至不会调出顶层或打印错误。它什么也没做,我回到了我从 Bash 提示开始的地方。

如果您想以这种方式 运行 您的代码,您会受到以下事实的限制 ocaml 命令需要任意数量的预编译 OCaml 文件(字节码文件)和一个.ml 文件。如果您提供多个 .ml 文件,它会忽略除第一个以外的所有文件。

您观察到的行为的原因是您的命令行要求 ocaml 到 运行 文件作为程序。换句话说,它将执行第一个 .ml 文件中的所有顶级代码(忽略其余部分),然后退出。我假设您没有任何在 module1.ml 文件中产生可见结果的顶级代码。

您可以通过使用 ocamlc:

编译其中一个文件以外的所有文件来完成这项工作(或至少改善情况)
$ ocamlc -c section1/module2.ml
$ ocamlc -c section2/module3.ml
$ ocaml section1/module2.cmo section1/module3.cmo module1.ml

您也可以在启动后将文件加载到顶层:

$ ocaml
        OCaml version 4.10.0

# #use "section1/module2.ml";;
# #use "section1/module3.ml";;
# #use "module1.ml";;
# 

这是我经常用我的代码进行交互试验的方法。

如果我只想 运行 代码,另一方面,我会编译所有文件,然后 运行 结果:

$ ocamlc -o myprogram section1/module2.ml section1/module3.ml module1.ml
$ ./myprogram

除了你已经给出的答案之外,如果你想从顶层加载模块而不编译模块,你可以使用 #mod_use 指令,添加我相信 ocaml-4.01。它的行为方式与 #use 指令类似,不同之处在于您的代码看起来就像是一个已编译的模块(因此文件名成为初始模块名称)。

http://caml.inria.fr/pub/docs/manual-ocaml/toplevel.html#s%3Atoplevel-directives