[英]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
显然,这是行不通的,因为带引号的参数值。 我可以在quote块中获取数据并采取相应的措施,但这会将整个逻辑放入使用我的宏的模块中,该宏非常脏。 我想注入尽可能少的代码。
您可以通过模式匹配(使用引号形式)来提取模块: {:__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
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.