quote与unquote属于elixir对meta-programming(元编程)的支持,使开发者拥有改变语言核心的能力(增加自定义核心函数, 扩展语言核心)。Elixir程序的构建块由一个三元素的元组组成,列如函数sum(1, 2, 3)的内部表述为(AST abstract syntax tree 抽象语法书):
{
:sum, [], [1, 2, 3]}
我们可以在iex中使用
iex(1)> quote do: sum(1,2,3)
{:sum, [], [1, 2, 3]}
查看。AST元组中第一个元素是函数名,第二个元素是包含元数据的键值对列表(此处为空),第三个元素是函数参数列表。所以quote函数提供一种得到函数(函数式语言一切皆函数)的元信息,这些信息就是系统用来编译出最终运行文件的重要数据。当我们有了这些元数据后,如何修改它或是注入我们想要的数据,来改变清运行结果?unquote的作用正是再此。这里举一个例子
iex> denominator = 2
2
iex> quote do: divide(42, denominator)
{:divide, [], [42, {:denominator, [], Elixir}]}
iex> quote do: divide(42, unquote(denominator))
{:divide, [], [42, 2