如何在Nim中获取程序名称?

mjy*_*mjy 5 macros nim-lang

我正在尝试用Nim语言编写一个用于调试打印的宏.目前这款宏将filenameline由输出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中一样?

def*_*ef- 6

在运行时,您可以这样做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)