原问题 : 链接已解决,为补充中文版面资料特补问。。
问题描述
在宏定义中使用调用者的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