我正在尝试制作一个功能更强大的自定义断言函数,除了问题是断言异常指向自定义断言函数内部,这对最终用户在试图找出哪个断言时没有用断言失败。
这是我目前所拥有的:
let assert_eq (exp: 'a) (exp2: 'a) =
assert (exp = exp2)
最佳答案
OCaml 没有函数接口(interface)来确定其调用站点的详细信息。内置断言机制之所以可能是因为:它是一种内置机制,而不是普通的函数调用。
有一种方法可以确定当前函数、文件名、行号和模块。在 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 高级功能的项目。
关于ocaml - 如何在 OCaml 中打印调用函数的文件位置?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/73860764/