应该将元组传递给宏吗?

时间:2016-05-12 03:33:06

标签: elixir

处理元组的方式似乎不一致:

defmodule A do
  defmacro a(x) do
    IO.inspect x
    quote do end
  end
end

A.a {:a, :b}按预期打印{:a, :b},但A.a {:a}打印{:{}, [line: 2], [:a]}

1 个答案:

答案 0 :(得分:5)

宏以引用的表达式接收它们的参数,在Elixir中,长度为2的元组表示为它们自己,其余的表示为{:{}, _, [value1, value2, ...]}

iex(1)> Macro.escape {}
{:{}, [], []}
iex(2)> Macro.escape {1}
{:{}, [], [1]}
iex(3)> Macro.escape {1, 2}
{1, 2}
iex(4)> Macro.escape {1, 2, 3}
{:{}, [], [1, 2, 3]}
iex(5)> Macro.escape {1, 2, 3, 4}
{:{}, [], [1, 2, 3, 4]}

如果使用quote将这些值注入unquote,它们将自动转换为实际元组。我们可以看到使用Macro.to_string/2

iex(6)> Macro.to_string {:{}, [], [1, 2, 3]}
"{1, 2, 3}"

您可以在Quote and unquote -> Escaping入门指南中找到有关此内容的更多信息。