我有一个宏,它获取模块名称作为参数,我想调用该模块上的函数来获取一些数据,以生成quote
块。
示例:
defmacro my_macro(module) do
data = apply(module, :config, [])
# do something with data to generate the quote do end
end
显然,这不起作用,因为引用了参数值。我可以获取引用块内的数据并采取相应的行动,但这会将整个逻辑放在使用我的宏的模块中,这非常脏。我想注入尽可能少的代码。
答案 0 :(得分:1)
您可以通过与其引用形式匹配的模式提取模块:{:__aliases__, _, list}
其中list
是原子列表,当与点连接时(使用Module.concat/1
)会产生完整的模块名称。
defmodule A do
defmacro my_macro({:__aliases__, _, list}) do
module = Module.concat(list)
module.foo()
end
end
defmodule B do
def foo do
quote do
42
end
end
end
defmodule C do
import A
IO.inspect my_macro B
end
输出:
42