Я собираю вложенный проект OCaml для класса CS, а часть его включает в себя выполнение операций с списком. Я хочу, чтобы они могли использовать Pervasives, но не List или любые другие стандартные библиотечные модули. Есть ли способ настроить ocamlbuild, чтобы он связывался только с Pervasives в стандартной библиотеке?Не связывайте все стандартные библиотечные модули при компиляции OCaml
ответ
Я вижу две возможности: либо удалить модуль непосредственно из стандартной библиотеки 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).
Вы можете использовать опцию компиляторов -nostdlib
, но это скроет как Pervasives
, так и List
.
То, чего вы хотите, трудно достичь, поскольку оба блока компиляции являются частью одного и того же архива библиотеки, а именно: stdlib.cma
.
Возможно, вы попытаетесь скомпилировать вашу собственную копию Pervasives
и использовать вышеуказанный флаг.
Хороший ответ. @SaxSalute: убедитесь, что вы помещаете perervasives.cm [oi] в рабочий каталог, но не помещаете .ml. Вы действительно не хотите, чтобы ваши ученики смотрели на этот код. – PatJ
- 1. OCaml отсутствует стандартные библиотечные функции
- 2. Как определить, какие стандартные библиотечные модули Python содержат определенный метод?
- 3. Какие стандартные библиотечные модули необходимы для запуска интерпретатора Python 3.5?
- 4. Гарантирование стандартные библиотечные контейнеры освобождаются
- 5. OCaml рекурсивные модули по единицам компиляции
- 6. Обнаружение, если включены стандартные библиотечные контейнеры
- 7. Unbound модули в OCaml
- 8. Как просмотреть стандартные библиотечные функции в C++?
- 9. C++ применяет стандартные библиотечные алгоритмы к функциям
- 10. OCaml: Установить модули
- 11. модули OCaml и подписи
- 12. Модули OCaml/reason design
- 13. модули OCAML реализация
- 14. Как установить модули OCaml?
- 15. вдруг не связывайте установить
- 16. Py2App Не удается найти стандартные модули
- 17. Модульные модули OCaml с pa_ounit
- 18. Логика процесса компиляции ocaml
- 19. Ошибка компиляции в OCaml
- 20. Ошибка Ocaml: модуль Unbound при компиляции
- 21. OCaml - Подписи, модули и типы
- 22. Почему многие встроенные/стандартные библиотечные функции Python фактически являются классами
- 23. GCC или сделать флаг запретить определенные стандартные библиотечные функции
- 24. Какие стандартные типы библиотеки OCaml нельзя сортировать?
- 25. Ошибка компиляции OCaml-WebSocket
- 26. OCAML Где ошибка компиляции?
- 27. cygwin не создает файл a.out при компиляции для ocaml
- 28. Не удается найти модуль OCaml FileInfo при компиляции частей Hack
- 29. Импортировать общие модули по умолчанию при компиляции SCSS
- 30. LLVM учебник OCaml Ошибка компиляции
Я считаю, что для наших целей скрытие модуля List с чистой подписью модуля является идеальным решением! Я не знаю, почему я об этом не думал. Спасибо! – SaxSalute