我试图编写生成模块的宏:
defmodule GenModules do
defmacro module(name, do: body) do
quote do
defmodule unquote(String.to_atom(name)) do
unquote(body)
end
end
end
end
我所缺少的是如何注入' import'将引用模块的语句将从中调用宏?
即,以下代码:
defmodule Test do
import GenModules
module "NewModule" do
def test_call do
hello_world
end
end
def hello_world do
IO.puts "Hello"
end
end
不会编译,因为生成的NewModule无法看到hello_world函数。
所以我需要生成
import Test
在模块的主体之前,以某种方式获取调用宏的模块的名称。我该怎么做?
谢谢你, 鲍里斯
答案 0 :(得分:1)
要获取从您调用宏的模块,可以使用特殊形式__CALLER__
。它包含大量信息,但您可以像这样提取调用模块:
__CALLER__.context_modules |> hd
但更一般地说,我不认为你想要的是什么 - 在完成定义之前你不能导入模块。例如:
defmodule A do
defmodule B do
import A
end
end
导致错误:
** (CompileError) test.exs:3: module A is not loaded but was defined.
This happens because you are trying to use a module in the same context it is defined.
Try defining the module outside the context that requires it.