我正在为CS类组合一个介绍OCaml项目,其中一部分涉及实现列表操作。我希望他们能够使用Pervasives,但不能使用List或任何其他标准库模块。有没有办法设置ocamlbuild所以它只链接标准库中的Pervasives?
答案 0 :(得分:2)
您可以使用编译器的-nostdlib
选项,但这会隐藏Pervasives
和List
。
您想要的是很难实现的,因为两个编译单元都属于同一个库归档stdlib.cma
。
您可以尝试编译自己的Pervasives
副本并使用上面的标记。
答案 1 :(得分:1)
我看到两个机会:直接从OCaml标准库中删除模块,或者通过使用具有不同(可能为空)签名的模块重载来隐藏它们。
第一个变体需要编辑OCaml分发Makefile。实际上,使用opam并不是那么可怕,因为您可以非常轻松地修补OCaml并将每个修补的OCaml作为单独的编译器进行分发。要从stdlib存档中删除模块,您需要修改stdlib/Makefile.shared
,stdlib/StdlibModules
和stdlib.mllib
。删除不必要的模块后,您可以执行以下操作:
./configure
make world.opt
make install
另一种选择是(ab)使用-open
ocamlc
命令行参数。如果使用模块名称指定此选项,则将在编译的程序中自动打开此模块。例如,您可以在标准库上编写自己的叠加层,该库具有以下接口(minimal.mli
):
module List = sig end (* or whatever you want to expose *)
然后您可以使用ocamlc -open minimal ...
进行编译,或者使用ocamlbuild
进行编译:{{1}}(您也可以使用ocamlbuild -cflags -open,minimal ...
文件来传递打开标记,或者编写ocamlbuild插件)。