2016-09-22 12 views

答えて

2

はい、しかし、ブロックとdo_something_else_withは両方ともvar!(state)を常に使用する必要があります。その結果、マクロ衛生は結果としてstateに結果のコードで異なる名前を与えません。ここでは例です:

defmodule Main do 
    defmacro with_state(do: block) do 
    quote do 
     var!(state) = "something" 
     IO.inspect {:before, var!(state)} 
     unquote(block) 
     IO.inspect {:after, var!(state)} 
    end 
    end 

    def main do 
    with_state do 
     IO.inspect {:inside_before, var!(state)} 
     var!(state) = "else" 
     IO.inspect {:inside_after, var!(state)} 
    end 
    end 
end 

Main.main 

出力:

{:before, "something"} 
{:inside_before, "something"} 
{:inside_after, "else"} 
{:after, "else"} 
+0

はどうもありがとうございました! – Haito

関連する問題