はい、しかし、ブロックと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"}
はどうもありがとうございました! – Haito