gpt4 book ai didi

嵌入 ocaml 解释器

转载 作者:行者123 更新时间:2023-12-05 06:45:04 29 4
gpt4 key购买 nike

我有一种小型语言,它基本上是 OCaml 的扩展(实际上它是 OCaml 子集的扩展,但这并不重要)。为了简化事情,我有一个“转义”表达式,可以将 OCaml 文字传输到我的语言中(因此您可以将任意 OCaml 代码嵌入到这种语言中)。将这样的表达式编译为 OCaml 只意味着解开字符串,但如何计算它呢?

当然,我知道 OCaml 是一种静态类型语言以及该类型系统的一般工作方式。因此,我还需要能够提供一个环境并检查表达式的推断类型(或至少应对类型错误)。我也知道需要管理解释器状态等。让我们暂时假设嵌入式表达式没有副作用。

显然这是可能的,因为 utop 和 toplevel 都是在 OCaml 中实现的。所以我的第一个想法是只选择其中一个并根据我的需要进行调整。现在解决我的问题:

  • toplevel 显然是主要分布的一部分。虽然有一个具有必要功能的 toplevel.mli 甚至一个 .mllib,但我找不到作为打包库的 toplevel - 是否需要进一步的配置调整才能获得“interpreter-as-a-library”包?

  • utop 似乎做了更奇怪的事情。据我所知,它在构建时将一些编译器库复制到其源目录中。这似乎很奇怪:如果它在构建时知道如何找到这些编译器库,为什么不直接链接?

那么有没有任何合理的方法可以将 OCaml 解释器嵌入到 OCaml 程序中?

最佳答案

afaik,最简单的方法是使用字节码编译器将提供的代码编译成模块,然后使用dynlink 加载它并执行。您也可以通过 native 编译器对其进行编译,但这需要您进行安装。

更新

你可以用任何方式编译你的文件,包括system命令,但你也可以直接调用编译器接口(interface)[1]:

Compile.implementation Format.std_formatter "test.ml" "test";;

这将在与“test.ml”文件相同的目录中创建 test.cmotest.cmi 文件。之后,您可以使用 Dynlink 加载它:

Dynlink.loadfile "test.cmo";;

[1] 该模块位于 compiler-libs 库中的某处,可能是 "compiler-libs.bytecomp"

关于嵌入 ocaml 解释器,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/26356245/

29 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com