Код Ocaml, который компилируется, но не идет с верхнего уровня
Я делаю упражнение бесплатного курса. Следующий код ocaml компилируется, когда я "делаю", но он жалуется, когда я пытаюсь перевести его на верхний уровень. Зачем?
let main () =
(* Parsing arguments *)
let f_name = ref "" in
Arg.parse [ ] (fun s -> f_name := s) "Mini-Java analyzer";
(* Parsing of the source file *)
let simple_java_prog =
if String.compare !f_name "" = 0 then failwith "no program file given";
Localizing.current_file_name := !f_name;
let f_desc = open_in !f_name in
let lexbuf = Lexing.from_channel f_desc in
let java_prog =
try Java_parser.program Java_lexer.token lexbuf
with
| e ->
Printf.printf "Exception during parsing: %s\n"
(Printexc.to_string e);
failwith "Stopped" in
Simple_java_translate.tr_java_prog java_prog in
Printf.printf "finished...\n"
let _ = main ()
Но когда я "cc ce" (из emacs) этот код для верхнего уровня, это дает мне ошибку
....
let main () =
Error: Reference to undefined global `Localizing'
затем, с этой информацией об ошибке, я получил объяснение от
http://caml.inria.fr/pub/docs/manual-ocaml/manual023.html
который говорит,
Ссылка на неопределенный глобальный мод. Вы забыли загрузить в память реализацию модуля с #load.
Таким образом, я пытаюсь сделать: #load "localizing.cmo". Но теперь проблема в том, что localization.cmo не существует. Вот результат поиска.
bash-3.2$ ls localizing*
localizing.cmi localizing.cmx localizing.ml localizing.mli localizing.o
Я стесняюсь размещать здесь makefile, источник проблемы не должен исходить из "Makefile", к тому же он такой большой. Кроме того, я не должен изменять make-файл, потому что он предоставлен сайтом курса.
В чем проблема?? Спасибо. Правильно ли я пришел к выводу, что не все программы ocaml должны выполняться на высоком уровне?
1 ответ
Проблема в make-файле, или, по крайней мере, решение частично.
.cmi
файлы представляют собой скомпилированные интерфейсы (скомпилированные из.mli
)..cmo
файлы представляют собой скомпилированные реализации с байт-кодом (скомпилированные из.ml
сocamlc
)..cmx
а также.o
файлы представляют собой скомпилированные реализации с собственным кодом (скомпилированные из.ml
сocamlopt
).
Вы скомпилировали свою программу в нативный код. Но на верхнем уровне запускается байт-код. Вам нужно скомпилировать модуль в байт-код, добавив что-то вроде этого в ваш make-файл:
default: localizing.cmo localizing.cmx
%.cmo: %.ml
ocamlc -c $<