处理元组的方式似乎不一致:
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]}
答案 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入门指南中找到有关此内容的更多信息。