gpt4 book ai didi

OCaml 在运行时编译和加载

转载 作者:行者123 更新时间:2023-12-01 08:00:05 25 4
gpt4 key购买 nike

我正在尝试实现类似于 eval()在 OCaml 中。

我有一个 string我想从中得到一个 OCaml 函数。
目前我正在做以下事情:

我将字符串转储到 new.ml并编译文件:

Compile.implementation Format.std_formatter "new.ml" "New"

然后我尝试 dynlink文件:
Dynlink.loadfile "new.cmo";

但是如果我尝试做 New.foo它失败。我不确定为什么在 Dynlink 之后无法访问模块 New ing。我错过了什么吗?

谢谢!

最佳答案

Dynlink.loadfile的评论说:

No facilities are provided to access value names defined by the unit. Therefore, the unit must register itself its entry points with the main program, e.g. by modifying tables of functions.



加载程序无法在没有任何提示的情况下访问动态加载模块的值,因为它不知道仅从 .cmo 中定义了哪些值。文件。动态加载的模块必须将其入口点注册到加载程序中定义的某个状态。

这是一个最小的例子。首先,入口点的模块:
(* entry.ml *)
let f : (unit -> unit) ref = ref (fun () -> assert false)

加载程序:
(* loader.ml *)
let () =
Dynlink.loadfile "plugin.cmo";
!Entry.f ()

要动态加载的插件:
(* plugin.ml *)
let () = Entry.f := (fun () -> prerr_endline "hello world")

在这里, Plugin将其函数注册到 Entry.f静态链接到 Loader ,所以 Loader可以访问该功能。

它们必须编译如下:
$ ocamlc -o loader.exe dynlink.cma entry.ml loader.ml
$ ocamlc -c plugin.ml

执行 loader.exe应该演示动态加载的工作原理:
$ ./loader.exe
hello world

请注意 EntryLoader必须是不同的模块。否则,你会得到 Uninitialized_global动态加载异常 Plugin .动态加载的模块只能访问“已经初始化的模块”中的值,加载器模块在 Dynlink.loadfile时认为自己尚未初始化被调用,因为模块的整个评估还没有完成。
Entry.f是只有一个入口点的最简单状态。要动态加载许多值,您可能需要更复杂的数据结构,例如 (string, (unit -> unit)) list ref(string, (unit -> unit)) Hashtbl.t .

关于OCaml 在运行时编译和加载,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/27398069/

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