возможно, я просто перестал работать в действительно простой вещи, но я разрабатываю intepreter, записанный в OCaml со стандартными инструментами как ocamllex и ocamlyacc, и у меня есть эта ситуация:
Тип инструкции, который определяет различные инструкции, находится в impossible.ml
и это необходимо синтаксическому анализатору, но impossible.ml
использует синтаксический анализатор, определенный в iparser.mly
таким образом, им обоим нужен друг друг для компиляции правильно.
Есть ли способ произвести просто .cmi
файл для моего impossible.ml
? Таким образом синтаксический анализатор знал бы о типах, определенных в impossible.ml
и это позволит мне компилировать impossible.cmo/.cmi
и более поздняя компиляция также impossible.cmo
. Затем я могу соединить всех их.
До сих пор мой сценарий компиляции:
ocamlyacc iparser.mly
ocamlc -c iparser.mli
ocamllex ilexer.mll
ocamlc -c ilexer.ml
ocamlc -c iparser.ml
ocamlc -c impossible.ml
ocamlc -o imp.exe ilexer.cmo iparser.cmo impossible.cmo
но это не работает потому что ocamlc -c iparser.ml
потребности, по крайней мере, impossible.cmi
знать типы.
Какие-либо предложения?Заранее спасибо..
Вам нужно создать невозможный.mli и скомпилировать его. Это создаст невозможный .cmi и только .cmi.
В качестве альтернативы:
ocamlc -i impossible.ml
напечатает mli в stdout. Вы можете сделать что-то вроде этого:
ocamlc -i impossible.ml > impossible.mli
ocamlc -c impossible.mli
IMHO, вы не можете законно компилировать рекурсивно-зависимые модули таким образом. Либо исключите взаимозависимости в третьем модуле (обычно это просто), либо передайте их как параметры (или изменяемые ссылки инициализации - некрасиво), либо используйте рекурсивные модули.