在解释和编译模式下包括OCaml模块

时间:2015-11-20 01:10:46

标签: module ocaml

假设我有一些OCaml代码,我需要使用Str模块。如果我使用解释器运行代码,那么我必须放置#load Str.cma才能使用Str模块。但是如果我想原生编译代码,那么load指令会导致错误。如何以两种情况下的方式导入模块?

我正在寻找任何一个 (a)包括在两种模式下均有效的模块的方法;或
(b)为解释器加载模块的方法,编译器将忽略该方法,让我在命令行中指定它。

3 个答案:

答案 0 :(得分:2)

您可以使用脚本方式使用OCaml(使用名为toplevel的ocaml二进制文件),就像您所描述的那样。脚本的优点是代码易于访问和更改。但是出现了一些问题:

  • 你的脚本是在每次调用时编译的字节码,这是非常快但不是最佳的
  • 加载所需包的指令特定于顶层并且与编译器不兼容
  • 如果您需要ocaml软件包管理器opam中的众多软件包之一,则必须全局安装opam,目前这是Linux管理工作而非正式推荐

因此,ocaml toplevel和编译器调用没有兼容的语法。 toplevel的命令行参数需要另一个包装脚本。

我的建议:

  • 使用顶层进行交互式开发,探索功能和测试
  • 使用opam安装程序为您的软件包编译器,这将为您提供可更新的工具
  • 根据您的要求将脚本编译为字节码或本机代码,编译后的代码可在平台内移植并快速

一旦您知道如何指定组件,编译对于ocaml程序来说非常简单。

作为旁注:有一个名为ocamlscript的opam包,它为您提供了一种脚本头中的包和依赖项的特定语法,但是将您的脚本透明地编译到磁盘。也许这就是你想要的 - 但需要安装全局opam。

答案 1 :(得分:1)

我不会将#load放入源文件中,它不是OCaml代码。这是对顶级的指导(当然你知道)。

一种可能性是将#load命令添加到~/.ocamlinit文件中。加载一些额外的模块并没有什么坏处,因此您只能在处理不同的事情时偶尔修改~/.ocamlinit

答案 2 :(得分:1)

如果您希望height: 68px; width: 482px; ocaml my_code.ml能够使用my_code.ml模块,请执行Str