Какой файл .cma соответствует какому модулю в OCaml? - PullRequest
7 голосов
/ 15 марта 2012

Если я программирую в OCaml toploop и хочу использовать пакет из стандартной библиотеки OCaml или какой-либо другой библиотеки , как я могу узнать, какой файл .cmaзагрузить?Например, в стандартной библиотеке String находится в str.cma, а Big_int - в nums.cma, поэтому имена файлов не различимы из имени или описания модуля.

Существует ли простой способнайти правильный файл для модуля?

Ответы [ 5 ]

6 голосов
/ 15 марта 2012

Обычно, имея библиотеку Ocaml .cma, вы можете получить модули, которые она определяет, используя objinfo (a.k.a. ocamlobjinfo, особенно в Debian, Ubuntu,…). Поэтому, учитывая пути к библиотекам (/ usr / lib / ocaml и т. Д.) И время, которое нужно потратить, должна быть возможность построить отображение между модулями и библиотекой Ocaml.

4 голосов
/ 15 марта 2012

Во-первых, вы на самом деле не хотите знать, какой cma загружать, скорее вы хотите знать, какой пакет загрузить через ocamlfind.Далее следует отметить, что компиляторы ocaml должны выполнить то же самое, чтобы скомпилировать проект - т.е. по имени модуля, на который есть ссылка в исходном коде, найти скомпилированный интерфейс для этого модуля.Итак, давайте подражаем этому поведению.Компиляторы получают пути включения из командной строки, но мы должны искать все возможные пути включения.Итак, мы идем:

for i in $(ocamlfind list | cut -d ' ' -f 1) ; do
  if [ -r $(ocamlfind query $i)/XXX.cmi ] ; then
    echo $i; break;
  fi ;
done

или

ocamlfind printconf path | xargs -n1 -I/ find / -name XXX.cmi

Примечание: отображение от имени модуля к имени файла не является уникальным - например, SomeModule может быть представлено либо someModule.cmi, либо SomeModule.cmi (реже).

2 голосов
/ 15 марта 2012

String (обычные функции для типа данных string) не в str.cma, а Str (функции для работы с регулярными выражениями), то есть.

Существует аналогичное обоснование дляимя nums.cma: оно в основном инкапсулирует модуль Num, который является слоем поверх различных библиотек "больших чисел" (Nat, Big_int, Ratio).Обратите внимание, что в настоящее время вы можете использовать Zarith .

1 голос
/ 19 марта 2012

Как предложил Po 'Lazarus, я использовал ocamlobjinfo, чтобы построить отображение между файлами .cma и модулями, определенными для удобства использования.

  • bigarray.cma:
    • BigArray
  • dbm.cma:
    • Dbm
  • dynlink.cma:
    • Dynlinkaux
    • Dynlink
  • graphics.cma:
    • График
    • GraphicsX11
  • nums.cma:
    • Int_misc
    • Nat
    • Big_int
    • Arith_flags
    • Соотношение
    • Количество
    • Arith_status
  • stdlib.cma
    • Pervasives
    • Массив
    • Список
    • Char
    • Строка
    • Sys
    • Hashtbl
    • Сортировка
    • Маршал
    • Obj
    • Int32
    • Int64
    • Nativeint
    • Lexing
    • Синтаксический
    • Установить
    • Карта
    • Stack
    • Очередь
    • CamlinternalLazy
    • Ленивый
    • Поток
    • Buffer
    • Printf
    • Формат
    • Scanf
    • Arg
    • Printexc
    • Сс
    • Digest
    • Случайные
    • Обратный вызов
    • CamlinternalOO
    • Оо
    • CamlinternalMod
    • Genlex
    • Слабое
    • Имя файла
    • комплекс
    • ArrayLabels
    • ListLabels
    • StringLabels
    • MoreLabels
    • StdLabels
  • str.cma:
    • Str
  • toplevellib.cma:
    • Разное
    • Tbl
    • Config
    • Clflags
    • Terminfo
    • Ccomp
    • Предупреждения
    • Consistbl
    • LINENUM
    • Местоположение
    • Longident
    • Syntaxerr
    • Parser
    • Лексер
    • Анализировать
    • Printast
    • Unused_var
    • идент
    • Путь
    • Примитивный
    • Типы
    • BTYPE
    • Oprint
    • Subst
    • Predef
    • Datarepr
    • ко
    • Typedtree
    • CTYPE
    • Printtyp
    • Includeclass
    • MTYPE
    • Includecore
    • Includemod
    • Parmatch
    • Typetexp
    • Stypes
    • Typecore
    • Typedecl
    • 1238 * класс типов *
    • Typemod
    • Lambda
    • Printlambda
    • Typeopt
    • переключатель
    • Matching
    • Translobj
    • Translcore
    • Translclass
    • Translmod
    • Simplif
    • Runtimedef
    • Meta
    • Instruct
    • Bytegen
    • Printinstr
    • Opcodes
    • Emitcode
    • Bytesections
    • Dll
    • Symtable
    • Bytelink
    • Bytelibrarian
    • Bytepackager
    • Pparse
    • Ошибка
    • Compile
    • Main_args
    • Genprintval
    • Toploop
    • Трассировка
    • Topdirs
    • Topmain
  • unix.cma:
    • Unix
    • UnixLabels
1 голос
/ 15 марта 2012

Я никогда не замечал этой проблемы, но вы правы, что ничего не можете сказать по названию модуля. Так как мне обычно приходится сначала читать документацию, я всегда получал информацию из документов (перечисленных в начале каждого раздела для стандартных модулей).

Удачным решением является использование GODI и связанного с ним механизма findlib, который, похоже, решает эту проблему и многие другие. В частности, он выходит за рамки только модулей, поставляемых с дистрибутивом OCaml.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...