2017-02-13 56 views
3

我正在为CS类组织一个介绍OCaml项目,其中一部分涉及实现列表操作。我希望他们能够使用Pervasives,但不能使用List或任何其他标准库模块。有没有办法设置ocamlbuild,所以它只能链接到标准库中的Pervasives?编译OCaml时不要链接所有标准库模块

回答

1

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

第一个变体需要编辑OCaml发行Makefiles。使用opam并没有那么可怕,实际上,您可以轻松地修补OCaml,并将每个修补后的OCaml作为单独的编译器分发。要从stdlib存档中删除模块,您需要编辑stdlib/Makefile.shared,stdlib/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 ...,或与ocamlbuildocamlbuild -cflags -open,minimal ...(你也可以使用_tags文件传递开放标志,或者写一个ocamlbuild插件)。

+0

我认为出于我们的目的,用空白模块签名隐藏List模块是一个完美的解决方案!我不知道为什么我没有想到这一点。非常感谢! – SaxSalute

2

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

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

你也许会尝试编译自己的Pervasives副本并使用上面的标志。

+0

很好的答案。 @SaxSalute:确保将pervasives.cm [oi]放在工作目录中,但不要放置.ml。你真的不希望你的学生看这个代码。 – PatJ