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.
我正在尝试编写生成模块的宏:
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.