因为宏有两个看似矛盾的性质:
宏也是 Elixir 代码
宏在在最终的字节码生成之前的展开阶段运行
Elixir 代码是如何在被生成之前运行的?它不能....要调用一个宏, 其容器模块(宏的定义所在的模块)必须已经被编译.
因此, 要运行 Tracer 模块中所定义的宏, 我们必须确认它已经被编译了....当我们 require 了一个模块, 我们会让 Elixir 暂停当前模块的编译, 直到我们 require
的模块编译好并载入到了编译器的运行时(编译器所在的 Erlang VM 实例)....下面我们通过 Plug 库的一个用例来演示, 我们如何使用 Plug 来制定路由:
get "/resource1" do
send_resp(conn, 200, ...)
end
post "...如之前所述, 这就是宏的用途. 它接收一些 AST 片段, 并将它们与样板代码组合在一起, 以生成最终结果.