【问题标题】:Accessing caller module attributes outside of quote do在报价之外访问调用者模块属性
【发布时间】:2017-01-23 10:12:01
【问题描述】:

我目前正在研究一些有趣的长生不老药宏。我有一个这样的模块:

defmodule MapUtils do

  @handlers "I don't want you"

  defmacro __using__(_) do
    quote do
      import MapUtils
      Module.register_attribute __MODULE__, :handlers, accumulate: true
      @handlers "I want you"
    end
  end

  defmacro test do
    IO.inspect @handlers
    quote  do
      IO.inspect(@handlers)
    end
  end
end

defmodule Test do
  use MapUtils

  def testowa do
    MapUtils.test
  end
end

Test.testowa

产生这样的结果:

"I don't want you"
["I want you"]

我想从引用块之外的调用者模块访问@handlers,以根据它的内容生成一些代码。据我了解,首先检查正在执行,其次正在转换为 AST 并在不同的上下文中执行。

有没有办法在编译时从调用者模块访问该@handlers?

【问题讨论】:

    标签: macros metaprogramming elixir


    【解决方案1】:

    如果我正确理解你的问题,你想要这个:

    Module.register_attribute __MODULE__, :handlers, 
                              accumulate: true,
                              persist: true
    

    改动前:

    iex(6)> Test.module_info(:attributes)
    [vsn: [95213125195364189087674570096731471099]]
    

    改动后:

    iex(13)> Test.module_info(:attributes)
    [vsn: [95213125195364189087674570096731471099], handlers: ["I want you"]]
    

    【讨论】:

      【解决方案2】:

      我偶然发现了this

      我意识到我可以像这样用__CALLER__ 调用它:

      Module.get_attribute(__CALLER__.module, :handlers)
      

      实际上它返回了它应该返回的值。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2017-10-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2010-10-20
        相关资源
        最近更新 更多