编译 OCaml 时不要 Link 所有标准库模块

Don't Link all Standard Library Modules when Compiling OCaml

我正在为 CS class 整理一个介绍性 OCaml 项目,其中一部分涉及实现列表操作。我希望他们能够使用 Pervasives,但不能使用 List 或任何其他标准库模块。有没有办法设置 ocamlbuild,使其仅链接到标准库中的 Pervasives?

您可以使用编译器的 -nostdlib 选项,但这会隐藏 PervasivesList

你想要的很难实现,因为两个编译单元都是同一个库存档的一部分,即 stdlib.cma

您可以尝试编译您自己的 Pervasives 副本并使用上面的标志。

我看到两个机会:要么直接从 OCaml 标准库中删除模块,要么通过重载具有不同(可能为空)签名的模块来隐藏它们。

第一个变体需要编辑 OCaml 分发 Makefile。使用 opam 并没有那么可怕,实际上,因为您可以很容易地修补 OCaml 并将每个修补的 OCaml 作为单独的编译器分发。要从 stdlib 存档中删除模块,您需要编辑 stdlib/Makefile.sharedstdlib/StdlibModulesstdlib.mllib。删除不需要的模块后,您可以:

./configure
make world.opt
make install

另一种选择是(ab)使用 ocamlc-open 命令行参数。当这个选项指定了一个模块的名称时,这个模块将在编译的程序中自动打开。例如,您可以在具有以下接口 (minimal.mli) 的标准库上编写自己的叠加层:

module List = sig end (* or whatever you want to expose *)

然后你可以用 ocamlc -open minimal ... 编译,或者用 ocamlbuild 编译: ocamlbuild -cflags -open,minimal ... (你也可以使用 _tags 文件来传递打开标志,或者编写一个 ocamlbuild 插件)。