Я изучаю метапрограммирование Elixir, и я играю с созданием macro
, что позволяет мне определять ресурсы REST. Интерфейс будет выглядеть так:Eixir metaprogramming - определяющий макрос, доступный во время компиляции изнутри макроса
defmodule Router do
use Resources
resource "cars"
resource "animals"
end
я добрался до определения атрибута модуля, используя 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
.
Как я могу заставить код в Router работать, чтобы вызывающий ресурс «xxx» толкал «xxx» в стек в атрибуте модуля @stack
?