我正在尝试创建一个具有更强大功能的自定义断言函数,但问题是断言异常指向自定义断言函数内部,这对于最终用户试图找出哪个断言失败时没有用。
这是我到目前为止所拥有的:
let assert_eq (exp: 'a) (exp2: 'a) =
assert (exp = exp2)
Run Code Online (Sandbox Code Playgroud)
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 高级功能的项目。
| 归档时间: |
|
| 查看次数: |
112 次 |
| 最近记录: |