从终端编译和运行 Ocaml 脚本

Add*_*dem 2 ocaml read-eval-print-loop

我有名为assert.ml、和的文件assert.mlitest.mltest.mli存储在一个文件夹中。 assert我猜你会称它为库文件吗——它是我下载的,但不是我自己写的。 test.ml是一个包含脚本的文件

;; open Assert 
;; print_endline "test"
Run Code Online (Sandbox Code Playgroud)

在终端中,我导航到包含文件夹并运行

$ ocamlc -c assert.mli test.mli
$ ocaml assert.ml test.ml
Run Code Online (Sandbox Code Playgroud)

结果什么也没有发生。但是,如果我;; open Assert从脚本中删除该行并运行

$ ocaml test.ml
Run Code Online (Sandbox Code Playgroud)

然后它打印。

请注意,有人告诉我不要写 open 命令,;; open Assert但建议似乎完全是风格化的。我必须为我正在上的课这样写。

如果有人能向我解释我应该如何以不同的方式编译和运行,我将不胜感激。我尝试按照其他一些指南的建议使用,ocamlopt但是当我运行它时,结果没有生成可执行文件。

Jef*_*eld 5

ocaml命令是 OCaml 的 REPL。命令行如下所示:

ocaml [ object-files ] [ script-file ]
Run Code Online (Sandbox Code Playgroud)

目标文件是由ocamlc命令生成的编译(字节码)模块。这些文件以.cmo. 脚本文件是 OCaml 源代码文件,以.ml.

请注意,只允许使用一个脚本文件。

你说你正在使用的命令有两个脚本文件,没有目标文件。因此,它不起作用也就不足为奇了。在我的实验中,ocaml只运行两个脚本文件中的第一个。我相信这解释了你所看到的。你的一个文件产生输出,如果你先给出它就会运行。另一个不产生输出,因此当首先给出该文件时没有输出。

您可能应该做的是.cmoAssert模块生成一个文件。

那看起来像这样:

$ ocamlc -c assert.mli assert.ml test.mli
Run Code Online (Sandbox Code Playgroud)

然后你应该运行ocaml一个目标文件和一个脚本文件,如下所示:

$ ocaml assert.cmo test.ml
Run Code Online (Sandbox Code Playgroud)