2016-04-08 4 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 - 基本的に研究努力はゼロです。確かに、あなたは、そのマクロの例をMac.to_string/1で見つけたのと同じソースです。 –

答えて

4

あなたは返却されている正確に何を検査するマクロでMacro.to_string/1IO.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 
関連する問題