【问题标题】:How to load multiple OCaml files into toplevel?如何将多个 OCaml 文件加载到顶层?
【发布时间】:2020-04-22 12:33:31
【问题描述】:

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

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 提示符开始的地方。

【问题讨论】:

    标签: module ocaml read-eval-print-loop toplevel


    【解决方案1】:

    如果您想以这种方式运行代码,您会受到以下事实的限制: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
    

    【讨论】:

      【解决方案2】:

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

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

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2013-01-23
        • 2021-03-08
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多