私はエリクシルのメタプログラミングを研究しています。私はmacro
を使ってRESTリソースを定義することができます。インターフェースは次のようになります:Eixirメタプログラミング - マクロ内でコンパイル時に利用可能なマクロを定義する
defmodule Router do
use Resources
resource "cars"
resource "animals"
end
Iまし限り動作するように、次のModule
モジュールを使用して、モジュールの属性を定義するが、私は得ることができないよう:
defmodule Resource do
defmacro __using__(_opts) do
quote do
Module.put_attribute __MODULE__, :stack, [1, 2, 3]
defmacro resource(name) do
stack = Module.get_attribute __MODULE__, :stack
Module.put_attribute __MODULE__, :stack, [name|stack]
end
end
end
end
次はしていませんコンパイル:
defmodule Domain do
use Resource
resource "foo"
def run do
IO.inspect @stack
end
end
リソース行を削除すると、[1, 2, 3]
が正しく印刷されます。
resource/1
マクロはrun/0
から表示されます。
ルーターでコードを取得して、リソース「xxx」を呼び出すと、@stack
モジュール属性のスタックに「xxx」がプッシュされますか?