在OCaml中"Eval"一个字符串

7
我正在尝试在OCaml中“eval”表示OCaml表达式的字符串。 我想做的类似于Python的 eval
到目前为止,我还没有找到太多资料。 Parsing 模块看起来可能有帮助,但我没有找到一种仅评估字符串的方法。

1
你能详细说明一下你的具体使用情况吗? - Drup
2个回答

13

以下是如何做到的,但我没有告诉你。(另外,解析模块是关于解析,而不是执行代码)

#require "compiler-libs" (* Assuming you're using utop, if compiling then this is the package you need *)
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)

例子:

eval "let () = print_endline \"hello\";;"

注意代码示例中的尾随";;"。
要使用ocamlbuild,您需要同时使用compiler-libs和compiler-libs.toplevel。

这个答案在 UTop 中绝对有效,但我在使用 ocamlbuild 时遇到了问题。我需要相同的“compiler-libs”包(-pkg compiler-libs),但是得到了错误信息“引用未定义的全局变量'Toploop'”。 - lezed1
实际上,我已经弄清楚了,并且编辑了您的答案以反映正确的软件包! - lezed1
@lezed1 好的,但我真的建议你不要使用这个,它完全绕过了类型系统。 - user1971598

0

OCaml是一种编译语言(不是解释语言)。因此,没有简单的方法来实现这个功能。当然,它没有像几乎所有解释语言那样支持这个功能的语言特性。你能做到的最好的事情就是将你的程序链接到OCaml toplevel(一个OCaml解释器)。


我在考虑使用顶层或utop的功能。我该如何链接它以提供类似eval的功能?我认为这是一个有用的文件,但我无法弄清楚如何使用它。https://github.com/ocaml/ocaml/blob/trunk/toplevel/toploop.ml - lezed1
此外,这似乎是顶层使用的实际解析器:https://github.com/ocaml/ocaml/blob/53fff352723eddd14baac86bc5fd187b4c74223b/parsing/parser.mly - lezed1
@lezed1 你可以这样做...即在文件上编译代码,然后执行它,但这不是在OCaml中编写代码的正确方式。(应该看看Compiler-libs) - user1971598

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接