Подтвердить что ты не робот

Где разместить общий служебный модуль в OCaml?

У меня есть файл Tools.ml, который содержит некоторые общие служебные функции, которые я пишу сам. В .../Code/ у меня есть несколько папок, каждый из которых содержит проект. Мой вопрос в том, где я должен разместить этот Tools.ml, чтобы все папки и файлы в .../Code/ могли совместно использовать этот модуль Open Tools.

Надеюсь, мой вопрос ясен... Кто-нибудь имеет хорошее решение?

Edit1: После ответа @gasche я написал Tools.ml следующим образом:

module Tools =
  struct
    let a_function = ...
    ...
  end

Затем я скомпилировал его и сделал ocamlfind install tools META tools.cmo tools.cmx tools.ml, как было предложено, что выглядит хорошо. Затем я написал test.ml следующим образом:

open Tools

let f = Tools.a_function

то я скомпилировал его с помощью ocamlc test.ml -o test, затем я получил сообщение об ошибке:

File "test.ml", line 1, characters 0-1:
Error: Error while linking test.cmo:
Reference to undefined global `Tools'

Может ли кто-нибудь сказать мне, что случилось?

4b9b3361

Ответ 1

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

Очень простой способ сделать это - написать META файл для ocamlfind. Создайте каталог где-нибудь, где вам удобно провести проект "персональная библиотека". Предположим, что у вас есть tools.ml и tools.mli, и ваш код зависит от некоторого пакета findlib (например, unix и bigarray). Вы META выглядели бы так:

name="tools"
description="personal collection of utilities"
version="0.1"
requires="unix,bigarray"
archive(byte)="tools.cmo"
archive(native)="tools.cmx"

Как только вы написали этот файл META, попросить ocamlfind "установить" библиотеку (и удалить ее, если хотите), и использовать ее в других проектах. Для установки синтаксис ocamlfind install <name> <meta-file> <file1> <file2> ..., где <file1>, <file2>.. - это файл, который вы хотите видеть, включенным в каталог установки. Вы должны, по крайней мере, иметь tools.cmi tools.cmotools.o и tools.cmx для встроенной компиляции), но неплохо также иметь tools.mli например (и, если вы хотите предоставить код, tools.ml).

ocamlfind install tools META tools.cmi tools.cmo tools.o tools.cmx tools.mli

(Конечно, tools.cmo и т.д. должны существовать, т.е. вы должны install после того, как вы скомпилировали свой пакет. Если вы использовали ocamlbuild, они, вероятно, будут находиться в подкаталоге _build, поэтому ocamlfind install ... _build/tools.cmo ....)

Из ваших многочисленных проектов вы можете легко использовать свою библиотеку, либо используя ocamlfind toold напрямую, если это то, что вы уже делаете, чтобы скомпилировать ваши программы.

ocamlfind ocamlc -package tools ....

или через средства, предоставляемые ocamlbuild, например, добавив package(tools) к вашим тегам.

Чтобы переустановить библиотеку, если вы внесли изменения в нее и хотите, чтобы она была доступна из ваших проектов

ocamlfind remove tools
ocamlfind install tools META ...

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