Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/elixir/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Macros Elixir宏:获取引号外的未引号参数值_Macros_Elixir_Metaprogramming - Fatal编程技术网

Macros Elixir宏:获取引号外的未引号参数值

Macros Elixir宏:获取引号外的未引号参数值,macros,elixir,metaprogramming,Macros,Elixir,Metaprogramming,我有一个宏,它获取一个模块名作为参数,我想调用该模块上的一个函数来获取一些数据,以便生成quote块 例如: defmacro my_macro(module) do data = apply(module, :config, []) # do something with data to generate the quote do end end 显然,这不起作用,因为引用了参数值。我可以在quote块中获取数据并相应地执行操作,但这会将整个逻辑放在使用我的宏的模块

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

例如:

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

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

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

您可以通过模式匹配将模块提取出来,其引用形式为:
{:{:{:{uuuuu别名},{uuu,列表}
其中
列表
是原子列表,当与点连接时(使用
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

令人惊叹的!甚至没有想到模式匹配引用的版本。