从好的方面来看, 宏在删除样板代码时非常有用(正如 ExActor 示例所展示的那样), 并且具有访问运行时不可用的信息的能力(正如您应该从 assert 示例中看到的那样)....最后, 由于宏在编译期间运行, 因此可以通过将计算转移到编译时来优化一些代码.
因此, 肯定会有适合宏的情况, 您不应该害怕使用它们....最后, 让我们来看一个被 quoted 的函数定义:
iex(4)> quote do def my_fun(arg1, arg2), do: :ok end
{:def, [context: Elixir...注意我们是如何对输入表达式进行模式匹配的, 希望它符合某种结构. 这完全没问题, 因为宏是函数, 这意味着您可以依赖于模式匹配、guards(守卫), 甚至有多子句宏....所以, 当我们想生成一个二进制操作代码时, 我们需要注入一个正确的 AST, 它(如前所述)与双参数的函数调用相同.