Elixir:具有正确导入功能的生成模块

鲍里斯·奥克纳(Boris Okner)

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

    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

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

谢谢鲍里斯

PawełObrok

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

本文收集自互联网,转载请注明来源。

如有侵权,请联系[email protected] 删除。

编辑于
0

我来说两句

0条评论
登录后参与评论

相关文章

来自分类Dev

导入具有类的模块

来自分类Dev

模块不支持预编译,但由具有以下功能的模块导入

来自分类Dev

defdelegate和def具有直接在Elixir中的调用模块功能的区别是什么

来自分类Dev

Elixir:具有不同功能的函数重载

来自分类Dev

elixir Enum或任何其他模块是否具有与ruby的group_by类似的group_by功能

来自分类Dev

Python - 具有导入功能的按钮

来自分类Dev

探索具有打印功能的abc模块

来自分类Dev

从模块中导入具有其名称的子模块

来自分类Dev

在Elixir中,有什么方法可以让模块列出其功能?

来自分类Dev

忽略正确导入的模块

来自分类Dev

具有返回功能的正确回调

来自分类Dev

具有子模块和功能的Python模块

来自分类Dev

具有子模块和功能的Python模块

来自分类Dev

从导入的模块覆盖导入模块的内置功能

来自分类Dev

打字稿导入功能进入现有模块的范围

来自分类Dev

使用importlib导入具有本地名称的模块

来自分类Dev

Python:具有相互依赖关系的模块的导入

来自分类Dev

导入具有条件导出的本地模块

来自分类Dev

React导入具有声明名称空间的模块

来自分类Dev

导入具有条件导出的本地模块

来自分类Dev

导入具有依赖性的NPM模块

来自分类Dev

导入具有其他javascript功能的HTML部分

来自分类Dev

具有空参数的实体框架功能导入

来自分类Dev

如何使用php导入具有复制功能的csv

来自分类Dev

Powershell不从模块导入功能

来自分类Dev

定义功能后导入模块

来自分类Dev

导入动态加载模块的功能

来自分类Dev

编写具有功能的适当Lua 5.1模块

来自分类Dev

编写具有功能的适当Lua 5.1模块