使用注入值
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"}
我正在尝试使用像这样的注入值:
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"}