Macros Elixir宏:获取引号外的未引号参数值
我有一个宏,它获取一个模块名作为参数,我想调用该模块上的一个函数来获取一些数据,以便生成Macros Elixir宏:获取引号外的未引号参数值,macros,elixir,metaprogramming,Macros,Elixir,Metaprogramming,我有一个宏,它获取一个模块名作为参数,我想调用该模块上的一个函数来获取一些数据,以便生成quote块 例如: defmacro my_macro(module) do data = apply(module, :config, []) # do something with data to generate the quote do end end 显然,这不起作用,因为引用了参数值。我可以在quote块中获取数据并相应地执行操作,但这会将整个逻辑放在使用我的宏的模块
quote
块
例如:
defmacro my_macro(module) do
data = apply(module, :config, [])
# do something with data to generate the quote do end
end
显然,这不起作用,因为引用了参数值。我可以在quote块中获取数据并相应地执行操作,但这会将整个逻辑放在使用我的宏的模块中,该宏非常脏。我希望注入尽可能少的代码。您可以通过模式匹配将模块提取出来,其引用形式为:
{:{:{:{uuuuu别名},{uuu,列表}
其中列表
是原子列表,当与点连接时(使用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
令人惊叹的!甚至没有想到模式匹配引用的版本。