Elixir:生成具有适当导入的模块

时间:2015-03-29 01:54:37

标签: macros elixir

我试图编写生成模块的宏:

    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

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

谢谢你, 鲍里斯

1 个答案:

答案 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.