2016-09-22 74 views
0

我試圖用注射值,如:使用注射值

quote do 
    var!(state) = "something" 
    unquote(block) 
    do_something_else_with(state) 
end 

我知道這是邪惡的,但我想這樣做只是爲了好玩。在該塊可能執行或未執行任何操作之後,是否可以訪問該狀態?

回答

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