繁体   English   中英

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

[英]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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM