使用注入值

Using injected values

我正在尝试使用像这样的注入值:

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

我知道这很邪恶,但我只是为了好玩。是否可以在该块可能对它执行任何操作或未对其执行任何操作后访问该状态?

是的,但是块和 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"}