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

Posted

技术标签:

【中文标题】如何在 utop 中重新加载 OCaml 模块【英文标题】:how to reload OCaml modules in utop 【发布时间】:2018-02-12 09:11:15 【问题描述】:

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

在使用 OCaml 代码时,我的开发工作流程是这样的:

首先,在 Vim 中打开一个文件 example.ml 并破解它。切换到另一个终端并运行utop。从utop 中,使用指令#use "example.ml";; 加载代码。

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

如果有一个#reload 指令可以重新加载所有以前加载的模块,那就太好了,但似乎没有。 有没有办法轻松地重新加载所有以前加载的模块?

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

【问题讨论】:

假设模块在两次运行之间没有变化。是否可以将目标文件传递给 utop?例如,您有一个文件 tree.ml 编译为 tree.cma(或 tree.cmo),您可以使用命令行“utop tree.cma”加载树模块。如果是这样,您只需要使用正确的选项重新启动 utop。默认情况下,它在 emacs 中可能效果不佳。 在来自#use "topfind";; 的问候消息中,它说:... Topfind.reset();; to force that packages will be reloaded ... 你可以把你所有的#uses 放在一个.ml 文件和#use 中,每次你想重新加载其中的所有内容时 【参考方案1】:

在问这个问题的时候,我相信dune 还没有将自己确立为 OCaml 的 构建系统。使用沙丘,您可以简单地启动一个加载了本地定义库的 utop 实例(如 here 所述),方法是:

$ dune utop <dir> -- <args>

&lt;dir&gt; 是一个目录,dune 将在该目录下搜索(递归) 对于将要加载的所有库

【讨论】:

以上是关于如何在 utop 中重新加载 OCaml 模块的主要内容,如果未能解决你的问题,请参考以下文章

如何在 utop 中生成多行代码?

在 OCaml 的 StdLib 中序列化“模块随机”的当前状态

python如何重新加载模块

如何在 Python 中重新加载模块的函数?

如何在烧瓶中重新加载python模块?

如何在 IDLE 中重新加载 Python 模块?