ocaml 在脚本模式下不加载 .ocamlinit

Wei*_* Li 4 ocaml

我发现当我ocaml在终端(即交互模式)中运行时,它将加载.ocamlinit. 但是,当我运行时ocaml test.ml,即在脚本模式下,它不会加载.ocamlinit文件。这实际上给我带来了一些麻烦,因为我的设置如下.ocamlinit:

let () =
  try Topdirs.dir_directory (Sys.getenv "OCAML_TOPLEVEL_PATH")
  with Not_found -> ()
;;

#use "topfind";;
#thread;;
#camlp4o;;
#require "core.top";;
#require "core.syntax";;
Run Code Online (Sandbox Code Playgroud)

因此,当我以交互模式运行时,#use "topfind"将被执行,并且我可以在代码中打开其他库。但由于.ocamlinit未在脚本模式下加载,当我ocaml test.ml在终端中运行时,test.ml如下所示:

打开 Core.Std;;

let () = print_endline "你好世界"

它将失败并出现错误:"Error: Unbound module Core"。

我的问题是:

  1. 如何解决这个问题,以便ocaml在脚本模式下运行时,该.ocamlinit文件也将被加载?
  2. 为什么ocaml顶层系统不.ocamlinit以脚本模式加载文件?

附:OCaml版本是4.01.0

gas*_*che 5

我认为这是顶层的一个“错误”(或者至少是意外的行为)。这可能会在 OCaml 的未来版本中得到修复。除此之外,我没有一个令人满意的解决方法来建议ocaml -noprompt < test.ml(这并不等同,因为您将从顶层得到一些嘈杂的输出,而不仅仅是执行的文件),或者当然编译程序并运行它(这可能很简单作为ocamlbuild test.byte && ./test.byte)。

  • 至少,“ocaml -init .ocamlinit test.ml”应该可以工作,而我的(轻度)测试表明它目前还不能工作。请注意,David Sheets 贡献了一个集成在 trunk 中的“-noinit”选项,因此应该在 4.02 中。 (2认同)