微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

如何在宏/模板中将函数名称作为字符串获取?

如何解决如何在宏/模板中将函数名称作为字符串获取?

无法弄清楚如何在宏中将函数名称作为字符串获取

下面的代码应该生成 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

解决方法

首先,您需要为宏接受 typeduntyped 参数。在这种特殊情况下,您需要使用 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 举报,一经查实,本站将立刻删除。