2017-02-13 5 views
3

Я собираю вложенный проект OCaml для класса CS, а часть его включает в себя выполнение операций с списком. Я хочу, чтобы они могли использовать Pervasives, но не List или любые другие стандартные библиотечные модули. Есть ли способ настроить ocamlbuild, чтобы он связывался только с Pervasives в стандартной библиотеке?Не связывайте все стандартные библиотечные модули при компиляции OCaml

ответ

1

Я вижу две возможности: либо удалить модуль непосредственно из стандартной библиотеки OCaml, либо скрыть их путем перегрузки модулем с другой (возможно пустой) сигнатурой.

Первый вариант требует редактирования дистрибутива OCaml Makefiles. С 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: ocamlbuild -cflags -open,minimal ... (вы также можете использовать _tags файл, чтобы передать открытый флаг, или написать плагин ocamlbuild).

+0

Я считаю, что для наших целей скрытие модуля List с чистой подписью модуля является идеальным решением! Я не знаю, почему я об этом не думал. Спасибо! – SaxSalute

2

Вы можете использовать опцию компиляторов -nostdlib, но это скроет как Pervasives, так и List.

То, чего вы хотите, трудно достичь, поскольку оба блока компиляции являются частью одного и того же архива библиотеки, а именно: stdlib.cma.

Возможно, вы попытаетесь скомпилировать вашу собственную копию Pervasives и использовать вышеуказанный флаг.

+0

Хороший ответ. @SaxSalute: убедитесь, что вы помещаете perervasives.cm [oi] в рабочий каталог, но не помещаете .ml. Вы действительно не хотите, чтобы ваши ученики смотрели на этот код. – PatJ

Смежные вопросы