如何在宏中获取调用者的scope或module

原问题 : 链接已解决,为补充中文版面资料特补问。。

问题描述

在宏定义中使用调用者的scope.
(由于拿到module就可以拿到对应scope中任意符号表示的对象), 所以实际上拿到宏调用者的module就好。

问题背景

  • 需求 在宏中获取调用者所在模块的类型元信息和静态成员,能够将部分运行时计算移到宏应用上,实现优化的目的。

如下例,在编译期确定结构体的成员后,可以直接使用一个常量的fields列表,而不需要在运行时每次都调用fieldnames。

module SomeModule
macro f()
    S =  caller_module.eval(:S)
    fields = fieldnames(S)
   # do something with fields
end

module OtherModule
import SomeModule: @f 
struct S 
    ...
end
function fn(...)
   let staged_analysis = @f
      # do stuff 
  end
end
2 个赞

答案是 __module__