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