由于宏也是函数, 而 Elixir 在调用函数时可以省略括号, 所以我们可以这样写:
Tracer.trace 1+2
这很可能是 Elixir 之所以不在函数调用时要求括号的最主要原因....宏参数
你要记住, 宏本质上是在扩展阶段被导入的 Elixir 函数, 然后生成最终的 AST. 宏的特别之处在于它所接受的参数都是quoted 的....2] end
[a: 1, b: 2]
iex(8)> quote do [a: x, b: y] end
[a: {:x, [], Elixir}, b: {:y, [], Elixir}]
在第一个例子中...理想情况下, 当我们这样做时, 我们不需要关心输入 AST 的内容, 在我们的例子中, 我们只需要在生成的函数中注入函数体, 而不需要关心函数体中实际有什么.
测试这个宏很简单....使用模块
观察上述代码, 你可以看到 match/2 的胶水代码存在于客户端模块中. 这肯定算不上完美, 因为每个客户端都必须提供对这个函数的正确实现, 而且必须调用 do_match 函数.