gpt4 book ai didi

ocaml - 链接的 OCaml 模块中存在多个 "mains"

转载 作者:行者123 更新时间:2023-12-02 00:53:45 25 4
gpt4 key购买 nike

我在 OCaml 中有许多“库”模块(主要是实用程序和辅助函数),我在末尾添加了以下类型的代码以进行简单的单元测试:

let main () = ...
main

let () = ...

这是主要打印到控制台的代码(用于简单的测试目的)。现在的问题是,当我将“库”模块与“主”模块链接并执行程序时,我会收到所有这些分散注意力的测试消息。有没有办法在 OCaml 模块中包含代码,该代码在模块单独链接时执行(从而促进简单的测试),但在用作“库”时不执行?我读过 SO 中的帖子,大意是 OCaml 没有“主”模块的概念,并且所有模块都是相同的,但在我看来,提供给链接器的目标文件的顺序可以解释为表明最后一个模块是“主”模块(因为它位于“依赖食物链”的顶部)。

最佳答案

OCaml支持模块的静态链接和动态加载;您通常所做的(以及类型安全的)是静态链接。如果您需要某种插件架构,我只会推荐动态加载。

无论如何,库只不过是一个模块(可能带有子模块)。如果静态链接模块,则所有“主”例程将按照可执行文件中链接的模块的顺序执行。

因此,如果您不采取任何措施,模块将不知道它以某种“神奇”的方式链接到哪个可执行文件;恕我直言,你应该做的是:

  • 将测试移出模块,可能使用 ounit
  • 至少将您的测试函数重写为真实函数,例如“让测试()=...”;然后编写一个测试前端,它将调用所有模块中的所有“测试”函数。

附录:

如果你用其他语言这样做,似乎也没有免费的蛋糕:

在 Java 中,如果您的代码中有多个电源,则必须明确选择您希望可执行文件运行的一个。

在 C 语言中,你可以使用 C 预处理器来做类似的事情

#ifdef TEST_1
int main() {
...
}
#endif

OCaml 有自己的预处理器 camlp4 ( camlp4 wikipedia article ) 你可以用它来做类似的事情。我个人确实认为这种测试嵌入是糟糕的软件工程。您应该从接口(interface)端测试您的模块/类/..,并用断言(存在于 Java、C 和 OCaml 中)标记您的内部不变量。

关于ocaml - 链接的 OCaml 模块中存在多个 "mains",我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/9981708/

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