带有Toploop / TopLevel的ocamlbuild

时间:2019-04-15 12:18:10

标签: ocaml ml ocamlbuild ocamlfind ocaml-toplevel

我希望在此处的答案中实现一个eval函数:https://stackoverflow.com/a/33293116/

但是,当我去编译我的代码示例时:

let eval code =
  let as_buf = Lexing.from_string code in
  let parsed = !Toploop.parse_toplevel_phrase as_buf in
  ignore (Toploop.execute_phrase true Format.std_formatter parsed)

let rec sum_until n =
  if n = 0
  then 0
  else n + sum_until (n - 1);;

let a = print_string "Enter sum_until x where x = an int: "; read_line ();;
print_int eval a;;

具有以下内容:

ocamlbuild UserInputEval.native -pkgs compiler-libs,compiler-libs.toplevel

我遇到了错误:

File "_none_", line 1: Error: Cannot find file
/usr/lib/ocaml/compiler-libs/ocamltoplevel.cmxa Command exited with
code 2.

我已经检查了setup-libs目录,但没有ocamltoplevel.cmxa文件,但是确实有ocamltoplevel.cma文件。

我想知道这是否是简单的解决方法?我对ocaml有点陌生,所以我不确定该如何解决。谢谢!

1 个答案:

答案 0 :(得分:1)

顶级库仅在字节码模式下可用:

ocamlbuild UserInputEval.byte -pkgs compiler-libs,compiler-libs.toplevel

还要注意,也许需要单独安装编译器库软件包(至少在archlinux中是这样)。

尽管如此,您的代码可能并没有达到您的期望:仅将用户输入提供给顶级解释器,而不会从顶级状态中读取任何内容。

如果您只想读取整数,则可以使用以下方法简单完成:

let a = print_string "Enter sum_until x where x = an int: \n"; read_int ();;
print_int (sum_until a);;

不需要编译器库。