Elixir Macros:在报价之外获取未引用的参数值
Elixir Macros: Get unquoted parameter value outside of quote
我有一个获取模块名称作为参数的宏,我想在该模块上调用一个函数来获取一些数据,以便生成 quote
块。
示例:
defmacro my_macro(module) do
data = apply(module, :config, [])
# do something with data to generate the quote do end
end
显然,这不起作用,因为参数值被引用了。我可以在引用块中获取数据并采取相应的行动,但这会将整个逻辑放在使用我的宏的模块中,这很脏。我想注入尽可能少的代码。
您可以通过与其引用形式进行模式匹配来提取模块:{:__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
我有一个获取模块名称作为参数的宏,我想在该模块上调用一个函数来获取一些数据,以便生成 quote
块。
示例:
defmacro my_macro(module) do
data = apply(module, :config, [])
# do something with data to generate the quote do end
end
显然,这不起作用,因为参数值被引用了。我可以在引用块中获取数据并采取相应的行动,但这会将整个逻辑放在使用我的宏的模块中,这很脏。我想注入尽可能少的代码。
您可以通过与其引用形式进行模式匹配来提取模块:{:__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