【问题标题】:ocamlbuild with Toploop/TopLevel带有 Toploop/TopLevel 的 ocamlbuild
【发布时间】:2019-09-05 10:16:23
【问题描述】:

我希望在此答案中实现 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.

我检查了 compiler-libs 目录,我没有 ocamltoplevel.cmxa 文件,但我有 ocamltoplevel.cma 文件。

我想知道这是否是一个简单的修复?我对 ocaml 有点陌生,所以我不确定如何解决这个问题。谢谢!

【问题讨论】:

    标签: ocaml ml ocamlbuild ocamlfind ocaml-toplevel


    【解决方案1】:

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

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

    还要注意,可能需要单独安装 compiler-libs 包(archlinux 至少是这种情况)。

    尽管如此,您的代码可能并没有按照您的预期进行:您只是将用户输入提供给顶级解释器,而没有从顶级状态读取任何内容。

    如果你只想读取一个整数,你可以这样做:

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

    不需要任何编译器库。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2017-06-15
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多