这是因为, get 宏在生成的代码中绑定了该变量....宏参数
你要记住, 宏本质上是在扩展阶段被导入的 Elixir 函数, 然后生成最终的 AST. 宏的特别之处在于它所接受的参数都是quoted 的....因为在宏代码中, 您可以很容易地从关键字列表中获取所需要的选项, 而不需要分析一些令人费解的AST....理想情况下, 当我们这样做时, 我们不需要关心输入 AST 的内容, 在我们的例子中, 我们只需要在生成的函数中注入函数体, 而不需要关心函数体中实际有什么.
测试这个宏很简单....以下是所需代码的最小化:
defmodule Plug.Router do
# 宏 get 从客户端删除样板代码
# 确保生成的代码符合泛型逻辑所需的一些标准
defmacro get(route