如何在 OCaml 中打印调用函数的文件位置?

Atl*_*inx 2 ocaml

我正在尝试创建一个具有更强大功能的自定义断言函数,但问题是断言异常指向自定义断言函数内部,这对于最终用户试图找出哪个断言失败时没有用。

这是我到目前为止所拥有的:

  let assert_eq (exp: 'a) (exp2: 'a) = 
    assert (exp = exp2)
Run Code Online (Sandbox Code Playgroud)

Jef*_*eld 6

OCaml 没有一个函数接口来确定其调用站点的详细信息。内置断言机制之所以可能,是因为:它是内置机制,而不是普通的函数调用。

有一种方法可以确定当前函数、文件名、行号和模块。在 Stdlib 的文档中(名为“调试”的部分),您将找到__FUNCTION___FILE____LINE____MODULE__。还有一些类似的名称可以捕获各种组合。Stdlib 的文档位于:https://v2.ocaml.org/releases/4.14/api/Stdlib.html

要创建一个可以从调用站点访问这些值的断言函数,我很确定您需要创建一个传递它们的语法扩展。目前首选的执行此操作的机制是 PPX。我能找到的关于 PPX 的最佳一般描述在这里: https: //ocaml-ppx.github.io/ppxlib/ppxlib/manual.html#what-is-ppx

总之,我想说这是一个需要 OCaml 高级功能的项目。