如何解决如何在宏/模板中将函数名称作为字符串获取?
下面的代码应该生成 rlisten("multiply",multiply)
但它不会编译,playground。
import macros
proc rlisten*[A,B,R](fn: string,op: proc(a: A,b: B): R): void =
echo fn
macro remotefn(fn): void =
quote do:
rlisten($`fn`,`fn`) # It should generte `rlisten("multiply",multiply)`
proc multiply(a,b: int): int = discard
remotefn multiply
解决方法
首先,您需要为宏接受 typed
或 untyped
参数。在这种特殊情况下,您需要使用 typed
参数才能访问函数 symbol(符号是由编译器的类型解析传递替换的标识符)。
import macros
proc rlisten*[A,B,R](fn: string,op: proc(a: A,b: B): R): void =
echo fn
macro remotefn(fn: typed): void =
echo fn.treeRepr()
# ^ Show tree representation of the argument. In this particular case it is just a
# single function symbol.
let name = fn.strVal()
echo "Function name is ",name
proc multiply(a,b: int): int = discard
remotefn multiply
输出
Sym "multiply"
Function name is multiply
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。