gpt4 book ai didi

macros - 如何获取 Nim 中的程序名称?

转载 作者:行者123 更新时间:2023-12-03 01:09:59 28 4
gpt4 key购买 nike

我正在尝试用 Nim 语言编写一个用于调试打印的宏。目前这个宏添加了filenamelineinstantiationInfo() 的输出.

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()

当前输出:

debug_print.nim:9: foo bar

我想添加调用宏的位置的过程(或迭代器)的名称。

期望的输出:

debug_print.nim:9(proc hello): foo bar

如何在 Nim 中获取过程(或迭代器)的名称,例如 __func__在C语言中?

最佳答案

在运行时,您可以执行getFrame().procname,但它仅适用于启用堆栈跟踪的情况(不适用于发布版本)。

令人惊讶的是,在编译时我找不到方法来做到这一点。宏模块中有callsite(),但它还不够。听起来可能适合 macros.LineInfo 对象。

一个 hacky 解决方案是同时使用 __func__ 并将其解析回 Nim 过程名称:

template procName: string =
var name: cstring
{.emit: "`name` = __func__;".}
($name).rsplit('_', 1)[0]

关于macros - 如何获取 Nim 中的程序名称?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/48686642/

28 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com