然而, 在上述代码中, 甚至没有提到 state. 那么我们是如何返回 state 的呢?这是因为 defcall 宏生成了一个隐藏的state 变量, 它之后将被 reply 宏明确使用....在上面两种情况中, 宏都必须创建一个不 hygienic 的变量, 而且必须在宏所引用的代码之外可见. 为达到这个目的, 可以使用 var! 结构....这些只不过是 Elixir 中的语法糖. 解释器将 do ... end 转换成了 {:do, ...}.
现在, 我只提到了参数是被引用(quoted)的....因为在宏代码中, 您可以很容易地从关键字列表中获取所需要的选项, 而不需要分析一些令人费解的AST....理想情况下, 当我们这样做时, 我们不需要关心输入 AST 的内容, 在我们的例子中, 我们只需要在生成的函数中注入函数体, 而不需要关心函数体中实际有什么.
测试这个宏很简单.