Here is another example :
defmodule Test do
defmacro rule(namex) do
quote do
def unquote(namex)() do
true
end
end
end
@lst [
{:sum, 5, 7 },
{:sum, 1, 3}
]
for { name, goal, work } <- @lst do
def unquote(name)({ unquote(Macro.escape(goal)), unquote(Macro.escape(work)) }), do: true
end
end
iex(8)> Test.rule(:test)
** (ArgumentError) cannot invoke def/2 outside module
(elixir) lib/kernel.ex:5122: Kernel.assert_module_scope/3
(elixir) lib/kernel.ex:3893: Kernel.define/4
(elixir) expanding macro: Kernel.def/2
iex:8: (file)
(prod_sys) expanding macro: Test.rule/1
iex:8: (file)
iex(8)> Test.sum({5,7})
true
iex(9)> Test.sum({1,3})
true






















