我正在尝试用Nim语言编写一个用于调试打印的宏.目前这款宏将filename与line由输出instantiationInfo().
import macros
macro debugPrint(msg: untyped): typed =
result = quote do:
let pos = instantiationInfo()
echo pos.filename, ":", pos.line, ": ", `msg`
proc hello() =
debugPrint "foo bar"
hello()
Run Code Online (Sandbox Code Playgroud)
目前输出:
debug_print.nim:9: foo bar
Run Code Online (Sandbox Code Playgroud)
我想添加调用宏的位置的过程(或迭代器)的名称.
期望的输出:
debug_print.nim:9(proc hello): foo bar
Run Code Online (Sandbox Code Playgroud)
如何在Nim中获取过程(或迭代器)的名称,就像__func__在C中一样?
在运行时,您可以这样做getFrame().procname,但它只适用于启用了堆栈跟踪(而不是在发布版本中).
令人惊讶的是,在编译时我无法找到方法.有callsite()在宏模块,但它并没有远远不够.这听起来像是可能适合macros.LineInfo对象的东西.
一个hacky解决方案是使用__func__并解析回Nim proc名称:
template procName: string =
var name: cstring
{.emit: "`name` = __func__;".}
($name).rsplit('_', 1)[0]
Run Code Online (Sandbox Code Playgroud)