gpt4 book ai didi

OCaml,扩展了一个程序,如 Emacs

转载 作者:行者123 更新时间:2023-12-04 23:41:58 28 4
gpt4 key购买 nike

我喜欢 OCaml,我正在等待我的 Real World OCaml 副本!
我是一个初学者 OCaml 程序员,只知道函数部分,有点命令式,但对模块、仿函数、对象等知之甚少......

对于一个解释器项目,我做了一个类似 emacs 的新手评估。我保留了一个三元组列表,其中包含作为字符串的命令名称绑定(bind)列表、用于描述的字符串以及要调用的 ocaml 函数。主循环只是在列表中查找匹配的条目并调用该函数。

然后添加新功能非常简单,您只需编写一个函数并将一个条目放入列表中。

我喜欢像 Emacs 一样自扩展的概念,这很容易扩展,但不是真正的自扩展。

我可以使用 OCaml 使程序自扩展吗?
我该怎么做?


我知道 Emacs 是如何工作的,它是一个大型虚拟机,所以它自己解释代码并修改它的运行时环境,但是有没有办法通过用户添加的模块向 OCaml 程序添加功能?或者是其他东西 ?

ps:如果我的项目对您来说听起来很基础,但我是初学者,请不要 mock 我!

谢谢

最佳答案

另一种解决方案可能是使用 Ocaml dynamic loading设施,例如Dynlink模块。例如,每个动态加载的共享模块可以将条目添加到一些全局哈希表,将字符串名称映射到函数(相同类型)等......动态加载模块的初始化 - 运行其顶级表达式 - 发生在其加载时(当你调用 Dynlink.loadfile 时),有点像旧的 _init POSIX 函数 dlopen
例如,您可以让您的程序在运行时发出一些 Ocaml 代码;将其编译成可加载的动态库 using ocamlopt -shared ;然后 Dynlink.loadfile那个图书馆。该库的初始化部分将使用主程序中提供的一些适当的函数来注册闭包。

或者,在 Ocaml 中编写(或使用)一些虚拟机或解释器。

您还可以使用一些 JIT 库,例如Ollvm ,并生成一些类似 C 的代码(可能在主程序的一些 C 粘合代码中使用 dlopen)。

但是作为 Simon Shine answered , MetaOcaml 可能是一个更好的方法。

顺便说一句,也许你想要一些 Common Lisp 实现?

例子:

(未经测试的代码!一些细节可能是错误的)

你的主程序prog.ml将包含

let ht = Hashtbl.create 53;;
let add_name_fun (name : string) (f : int -> int) =
Hashtbl.add ht name f;;
(* here you might emit the 'plugin.ml' file and fork its compilation *)
Dynlink.loadfile "plugin.cmxs";;
(* as an example we apply every added name & function to 3 *)
Hashtbl.iter ht (fun n f) -> Printf.printf "n=%s (f 3)=%d\n" n (f 3);;

您的 prog.mli将包含:
  val : add_name_fun : string -> (int -> int) -> unit;;

您的 plugin.ml将包含
  Prog.add_name_fun "foo" (fun x -> x+3);;

但我没有测试代码。

PS。在 POSIX 系统上,您可以在 C 中使用 dlopen 执行类似的操作。 & dlsym .我的海合会 MELT正在做 that .另见 this .

注意:如果您喜欢元编程方法,请阅读 J.Pitrat's blog和书籍。

关于OCaml,扩展了一个程序,如 Emacs,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/34674403/

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