如何在 utop 中重新加载 OCaml 模块

25

在OCaml的utop中重新加载模块是否可能?

当我尝试编写OCaml代码时,我的开发流程如下:

首先,在Vim中打开一个名为example.ml的文件,并进行修改。切换到另一个终端并运行utop。在utop中,使用指令#use "example.ml";;加载代码。

回到Vim并对代码进行一些更改。在更改代码后,我想尝试新的更改。返回到utop并重新运行指令#use "example.ml"

如果有一个#reload指令可以重新加载所有先前加载的模块,那将是很好的,但似乎没有这样的指令。是否有一种简单的方法来重新加载所有以前加载的模块?

理想情况下,这应该类似于GHCi的:reload命令。


1
假设模块在两次运行之间不会改变,那么能否将对象文件传递给 utop 呢?例如,您有一个名为 tree.ml 的文件,将其编译为 tree.cma(或 tree.cmo),您能否使用命令行“utop tree.cma”加载 tree 模块呢?如果可以,您只需使用正确的选项重新启动 utop。默认设置可能无法在 emacs 中很好地工作。 - 永劫回帰
在来自 #use "topfind";; 的问候消息中,它说:... Topfind.reset();; 以强制重新加载包 ... - dubiousjim
你可以将所有的 #use 放在一个 .ml 文件中,每次想要重新加载其中的所有内容时都可以使用 #use - Naeio
1个回答

2
在这个问题被提出的时候,我相信 dune 还没有成为 OCaml 的主流构建系统。使用 dune,您可以通过执行以下操作仅加载本地定义的库(如此处所述:here),并启动一个 utop 实例:
$ dune utop <dir> -- <args>

<dir> 是一个目录,在该目录下,dune将递归搜索所有要加载的库


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