iex(1)> value = {:a}
{:a}
iex(2)> a1 = quote do: a = {:a}
{:=, [], [{:a, [if_undefined: :apply], Elixir}, {:{}, [], [:a]}]}
iex(3)> a2 = quote do: a = unquote(value)
{:=, [], [{:a, [if_undefined: :apply], Elixir}, {:a}]}
iex(4)> a3 = quote do: a = unquote(Macro.escape(value))
{:=, [], [{:a, [if_undefined: :apply], Elixir}, {:{}, [], [:a]}]}
iex(5)> Macro.to_string(a1) == Macro.to_string(a2)
true
iex(6)> Macro.to_string(a2) == Macro.to_string(a3)
true
iex(7)> Macro.to_string(a1) == Macro.to_string(a3)
true
So what’s the difference between {:a}
and {:{}, [], [:a]}
? Does Elixir just expand {:a}
inside the a2
AST to {:{}, [], [:a]}
?