2016-04-08 2 views
0

Я стараюсь узнать макросы и имеет следующий фрагмент кода:Каково возвращаемое значение блока цитат?

defmodule ControlFlow do 

    defmacro unless(expression, do: block) do 
    quote do 
     if !unquote(expression), do: unquote(block) 
    end 
    end 

end 

И это работает, как ожидалось:

iex(16)> ControlFlow.unless 2 == 5, do: "block entered" 
"block entered" 

Теперь мой вопрос, что возвращаемое значение цитаты блока? Это?

if !false, do: "block entered" 
+0

Downvote - в целом нулевые исследовательские усилия. Разумеется, тот же источник, что и этот пример, был рассмотрен в Macro.to_string/1. –

ответ

4

Вы можете использовать Macro.to_string/1 и IO.puts/1 в макрос, чтобы проверить, что именно возвращается:

defmodule ControlFlow do 
    defmacro unless(expression, do: block) do 
    ast = quote do 
     if !unquote(expression), do: unquote(block) 
    end 
    ast |> Macro.to_string |> IO.puts 
    ast 
    end 
end 

Демо:

iex(1)> require ControlFlow 
nil 
iex(2)> ControlFlow.unless 2 == 5, do: "block entered" 
if(!(2 == 5)) do 
    "block entered" 
end 
"block entered" 

Итак, ваш код превращается в:

if(!(2 == 5)) do 
    "block entered" 
end 
Смежные вопросы