【问题标题】:Elixir Macros: Get unquoted parameter value outside of quoteElixir Macros:在引用之外获取未引用的参数值
【发布时间】:2018-01-25 17:31:38
【问题描述】:

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

例子:

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

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

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

【问题讨论】:

    标签: macros elixir metaprogramming


    【解决方案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
    

    【讨论】:

    • 太棒了!甚至没有考虑与引用版本匹配的模式。
    猜你喜欢
    • 1970-01-01
    • 2018-02-25
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-10-18
    • 1970-01-01
    相关资源
    最近更新 更多