Ocaml代码可以编译,但无法与toplevel一起使用

3

我正在做一个免费课程的练习。下面的ocaml代码可以在“make”时编译通过,但是一旦我尝试将它放入toplevel中,就会出现问题。为什么?

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 ()

但是当我从Emacs中使用"c-c c-e"将这段代码移动到顶层时,它会给我一个错误。

....    
  let main () =

Error: Reference to undefined global `Localizing'

然后,有了这个错误信息,我从http://caml.inria.fr/pub/docs/manual-ocaml/manual023.html 获得了解释。其说道:

对未定义的全局mod的引用 你忘了使用#load在内存中加载一个模块的实现。

因此,我试图运行:#load "localizing.cmo"。但是,现在的问题是:没有localizing.cmo。以下是搜索结果。
bash-3.2$ ls localizing*
localizing.cmi  localizing.cmx  localizing.ml   localizing.mli  localizing.o

我不太想在这里放置Makefile,问题的源头不应该来自于"Makefile",而且它很大。此外,我不应该修改Makefile,因为那是课程网站提供的。

问题是什么?谢谢。我的结论是正确的吗,即并非所有的OCaml程序都能在toplevel中执行?


你可以加载一个 cmo 或者 cma 文件。这两个文件都可以由 ocamlc[.opt] 创建。 - nlucaroni
我发现大多数问题的源头都来自于 Makefile -- 主要是酗酒。 - nlucaroni
1个回答

5
问题在于makefile文件中,或者至少部分解决方案在于其中。
  • .cmi文件是已编译的接口(从.mli编译而来)。
  • .cmo文件是字节码编译的实现(使用ocamlc.ml编译而来)。
  • .cmx.o文件是本地代码编译的实现(使用ocamlopt.ml编译而来)。

您已将程序编译为本地代码。但是toplevel运行字节码。您需要通过将类似以下内容添加到makefile中来将模块编译为字节码:

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

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接