2016-04-08 26 views
0
Ben makroları öğrenmek ve aşağıdaki kod parçacığını sahip deneyin

:Alıntı bloğun dönüş değeri nedir?

defmodule ControlFlow do 

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

end 

Ve beklendiği gibi çalışır:

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

Şimdi benim sorum, alıntı bloğunun dönüş değeri nedir nedir? Bu?

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

Downvote - temel olarak sıfır araştırma çabası. Tabii ki, bu örneği kapalı Macro.to_string/1'de de bulduğunuz kaynak. –

cevap

4

Tam olarak iade ediliyor ne incelemek için makro Macro.to_string/1 ve IO.puts/1 kullanabilirsiniz:

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 

Demo:

:

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

Yani, kod dönüşür

if(!(2 == 5)) do 
    "block entered" 
end