Код Ocaml, который компилируется, но не идет с верхнего уровня - PullRequest
3 голосов
/ 28 июня 2011

Я делаю упражнение бесплатного курса. Следующий код 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 ()

Но когда я "c-c c-e" (из 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 Ответ

5 голосов
/ 29 июня 2011

Проблема в make-файле, или, по крайней мере, решение частично.

  • .cmi файлы - это скомпилированные интерфейсы (скомпилированные из .mli).
  • .cmo файлы являются реализациями, скомпилированными с помощью байт-кода (скомпилированы из .ml с ocamlc).
  • .cmx и .o являются реализациями, скомпилированными с помощью собственного кода (скомпилированы из .ml с ocamlopt).

Вы скомпилировали свою программу в собственный код. Но на верхнем уровне запускается байт-код. Вам нужно скомпилировать модуль в байт-код, добавив что-то вроде этого в ваш make-файл:

default: localizing.cmo localizing.cmx
%.cmo: %.ml
        ocamlc -c $<
...