Elixir:通过正确导入生成模块

Elixir: generating module with proper import

我正在尝试编写生成模块的宏:

    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   

无法编译,因为 hello_world 函数在生成的 NewModule 中不可见。

所以我需要生成

    import Test

在模块主体之前,以某种方式获取调用宏的模块的名称。我该怎么做?

谢谢, 鲍里斯

要获取从中调用宏的模块,您可以使用特殊形式 __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.