2016-05-12 2 views
2

Путь кортежи обрабатываются, как представляется, не соответствует:Если кортежи передаются макросу?

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]}

ответ

4

Макросы получают свои аргументы, цитируемых выражений, и в эликсира, кортежи длины 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]} 

Если вводить эти значения s в quote с использованием unquote, они автоматически преобразуются в фактические кортежи. Мы можем видеть, что с помощью Macro.to_string/2:

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

Вы можете найти более подробную информацию об этом в Quote and unquote -> Escaping Руководство по началу работы.

Смежные вопросы