как выбрать между двумя кодами реализации в OCaml - PullRequest
0 голосов
/ 27 февраля 2019

Я загрузил очень маленький пример проекта в github репозиторий

У меня есть школьный проект.В спецификациях говорится, что мы можем включить или отключить компонент.

Я пришел из мира c, в котором мы можем скомпилировать c для объекта, и выбрал объект для связи.Я пытаюсь это сделать в OCaml.

У меня есть два исходных файла с одной и той же функцией, но их эффект различен.У меня есть две папки с именем «on» для реализации и папка «off» с пустым телом

Для теста у меня есть простой файл a.ml и a.mli, который печатает только hello world и b.mlib.ml, который вызывает модуль a.(поэтому у меня есть on / a.ml и off / a.ml)

Я компилирую версию on и off этой командой:

ocamlc -c -I on on/a.mli on/a.ml -o on/a.cmo

, затем пытаюсь связать C-way

ocamlc on/a.cmo  b.ml -o on_b.exe

но я получаю ошибку

File "b.ml", line 1, characters 9-15:
Error: Unbound module A

Я прочитал, я должен указать папку для поиска с -I.

ocamlc -I on -I off on/a.cmo  b.ml -o on_b.exe

Я был счастлив из-за этой работы для включенной версии

, но она не будет работать для выключенной версии

ocamlc -I on -I off off/a.cmo b.ml -o off_b.exe

Я получаю ошибку

Error: Files b.cmo and off/a.cmo
       make inconsistent assumptions over interface A

У меня естьпри проверке с ocamlobjinfo кажется, что он строит поиски B для первого модуля с именем A

. В этом примере у меня есть только A и B, но в будущем я буду собирать с какой-то версией и выключенной ... ноне делайте этого вручную

Решение найдено, но не очень эффективно, это очистить все файлы .cmo и .cmi ...

спасибо за ваше чтение и ваше время

РЕДАКТИРОВАТЬ:

Я также тестировал с -open, но, похоже, он работает только для стандартных модулей.

1 Ответ

0 голосов
/ 27 февраля 2019

Как видите, при компиляции файлов .mli создается файл .cmi.Это файл, который вы указываете, используя опцию -I dir.

Итак, если я вас правильно понимаю, у вас есть a.mli как в вашем каталоге on, так и в каталоге off.

Теперь, когда вы ссылаетесь на модуль A в своем коде, компилятор ищет его в текущем каталоге, а затем в связанных каталогах в том порядке, в котором они заданы .Когда вы компилируете «on», будет найден правильный .cmi (потому что -I on стоит перед -I off в вашей командной строке).В случае «off», находится «on» cmi, и компилятор видит, что он не соответствует правильному cmo.

Ваши две строки компиляции должны быть:

ocamlc -I on on/a.cmo  b.ml -o on_b.exe
ocamlc -I off off/a.cmo  b.ml -o off_b.exe
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...