0
我正在学习Elixir元编程,并且正在制作一个macro
,它允许我定义REST资源。接口会是这样:Eixir元编程 - 在宏内编译时定义宏
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
可见。
如何让路由器上的代码工作,以便调用资源“xxx”将“xxx”推入模块属性@stack
上的堆栈?