Ocaml 测试是否在utop中运行

Ocaml 测试是否在utop中运行,ocaml,prompt,utop,Ocaml,Prompt,Utop,我在我的.ocamlinit中添加了几行代码,以减少utop提示符的麻烦: #require "react";; #require "lambda-term";; UTop.prompt := fst (React.S.create LTerm_text.(eval [ S "\n"; B_bold true; B_fg (LTerm_style.cyan); S "# "; ]));; (我不理解那里发生的一切……我只是在网上找到了它并对其进行了调整。) 但是

我在我的
.ocamlinit
中添加了几行代码,以减少utop提示符的麻烦:

#require "react";;
#require "lambda-term";;
UTop.prompt := fst (React.S.create LTerm_text.(eval [
    S "\n";
    B_bold true;
    B_fg (LTerm_style.cyan);
    S "# ";
]));;
(我不理解那里发生的一切……我只是在网上找到了它并对其进行了调整。)

但是现在,如果我使用常规的
ocaml
toplevel,我会得到:

Error: Unbound module UTop

我是否可以在
.ocamlinit
中添加一个测试以跳过这些行,除非我正在运行utop?我可以把它们放在一个仅由utop加载的附加文件中吗?

如果您添加
#需要“utop”怎么办

我看到了这个错误:
异常:无效的参数“编译器libs中的ocamltoplevel.cma库不能加载到OCaml顶级中”
然后是
文件.ocamlinit”,第1行:错误:引用未定义的全局线程
(我跳过了许多行,如
/usr/local/lib/OCaml/unix.cma:loaded
)。这也是我的第一个猜测:)嗯,它在我这边起作用(像你一样更新了。ocamlinit)。我使用的是ocaml 4.04.0。@Tobia(1)一个解决方法(虽然不是很好)是将
.ocamlinit
分为两个文件:一个用于utop,另一个用于标准顶级,例如为
ocaml
创建一个别名,将
-init
传递到原始顶级。@Tobia(2)原则上,我们可以在OCaml代码中测试
Sys.executable\u name
,但是
\require
和其他指令存在问题(这不是有效的OCaml代码)。理想情况下,utop将使用不同的init文件感谢OCaml——让我们称之为.utoprc——或者在加载.ocamlinit之前查找.utoprc。想要在两者中使用相同配置的人可以使用某种include命令从inside.utoprc运行另一个文件。