2016-09-22 5 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