2016-09-15 10 views
1

現在、いくつかのエリクシールマクロの楽しいことに取り組んでいます。私はそのようなモジュールを持っている:引用符以外の呼び出し元モジュールの属性にアクセスする

このような結果に得
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にアクセスしたいです。私の理解が最初に検査される限り、検査が実行されており、2番目の検査はASTに変換されており、別の状況で実行されています。

呼び出し元モジュールからその@handlersにコンパイル時にアクセスする方法はありますか?

答えて

1

を私はthisにつまずきました。

私はそのような__CALLER__でそれを呼び出すことができます実現:

Module.get_attribute(__CALLER__.module, :handlers) 

そして、実際にそれが返すように仮定値を返しました。

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"]] 
関連する問題