Elixir Macros:在引用之外获取不带引号的参数值

时间:2018-01-25 17:31:39

标签: macros elixir metaprogramming

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

示例:

  defmacro my_macro(module) do
    data = apply(module, :config, [])

    # do something with data to generate the quote do end
  end

显然,这不起作用,因为引用了参数值。我可以获取引用块内的数据并采取相应的行动,但这会将整个逻辑放在使用我的宏的模块中,这非常脏。我想注入尽可能少的代码。

1 个答案:

答案 0 :(得分:1)

您可以通过与其引用形式匹配的模式提取模块:{:__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