我正在做一个免费课程的练习。下面的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 获得了解释。其说道:
因此,我试图运行:#load "localizing.cmo"。但是,现在的问题是:没有localizing.cmo。以下是搜索结果。对未定义的全局mod的引用 你忘了使用#load在内存中加载一个模块的实现。
bash-3.2$ ls localizing*
localizing.cmi localizing.cmx localizing.ml localizing.mli localizing.o
我不太想在这里放置Makefile,问题的源头不应该来自于"Makefile",而且它很大。此外,我不应该修改Makefile,因为那是课程网站提供的。
问题是什么?谢谢。我的结论是正确的吗,即并非所有的OCaml程序都能在toplevel中执行?
cmo
或者cma
文件。这两个文件都可以由ocamlc[.opt]
创建。 - nlucaroniMakefile
-- 主要是酗酒。 - nlucaroni