Elixir Macros:在引用之外获取未引用的参数值

Elixir Macros: Get unquoted parameter value outside of quote

我有一个宏,它获取模块名称作为参数,我想在该模块上调用一个函数来获取一些数据以生成 quote 块。

示例:

1
2
3
4
5
  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)会产生完整的模块名称。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
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

输出:

1
42