【发布时间】:2018-02-10 00:16:36
【问题描述】:
我正在研究一个宏,它会接受一个函数并添加一些额外的功能。例如:
这个:
defstate this_works(a, b) do
a + b + 1
end
应该转换成这个:
def this_works(a, b) do
IO.puts("LOGGING whatever")
a + b + 1
end
这是我目前所拥有的。尝试在 iex 中运行这段代码:
defmodule MyMacro do
defmacro defstate(ast, do: block) do
{fn_atom, _} = Macro.decompose_call(ast)
quote do
def unquote(fn_atom)(var!(a), var!(b)) do
IO.puts("LOGGING")
unquote(block)
end
end
end
end
defmodule Test1 do
import MyMacro
defstate this_works(a, b) do
a + b + 1
end
end
Test.this_works(1, 2)
这按预期工作。
现在,这个模块无法编译:
defmodule Test2 do
import MyMacro
defstate this_fails(a, b)
when 1 < 2
when 2 < 3
when 3 < 4 do
a + b + 1
end
end
唯一的变化是我添加了一个守卫,而宏无法处理。
我如何改进 MyMacro.defstate 以使其与具有任意数量警卫的函数一起使用?
【问题讨论】: