因为宏有两个看似矛盾的性质:
宏也是 Elixir 代码
宏在在最终的字节码生成之前的展开阶段运行
Elixir 代码是如何在被生成之前运行的?它不能....这意味着 quote(do: {a, b}) 将会返回一个二元元组, 它的两个值都是被引用(quoted)的.
iex(1)> quote do :an_atom end
:an_atom
iex(2...2}
iex(5)> quote do [1,2,3,4,5] end
[1, 2, 3, 4, 5]
对三元元组的引用(quoted)不会保留它的形状:
iex(6)> quote do {1,2,3...} end
{:{}, [], [1, 2, 3]}
由于列表和二元元组在被引用时能保留结构, 所以关键词列表(keywords list)也可以:
iex(7)> quote do [a: 1, b:...如之前所述, 这就是宏的用途. 它接收一些 AST 片段, 并将它们与样板代码组合在一起, 以生成最终结果.