【发布时间】:2016-04-25 16:03:10
【问题描述】:
我有一个宏来定义这样的模块。
defmodule Bar do
def bar do
IO.puts "I am #{inspect __MODULE__}"
end
end
defmodule MacroFun do
defmacro define_module(name) do
quote do
defmodule unquote(name) do
import Bar
def foo do
bar
IO.puts "I am #{inspect __MODULE__}"
end
end
end
end
end
defmodule Runner do
require MacroFun
def run do
MacroFun.define_module Foo
Foo.foo
end
end
Runner.run
运行这个的输出是:
I am Bar
I am Runner.Foo
这是有道理的; MacroFun.define_module 在Runner.run 中被调用,因此该模块被定义并嵌套在Runner 模块下。
但是现在如果我将MacroFun.define_module 更改为使用:bind_quoted 选项:
defmacro define_module(name) do
quote bind_quoted: [name: name] do
defmodule name do
import Bar
def foo do
bar
IO.puts "I am #{inspect __MODULE__}"
end
end
end
end
现在的输出变成:
I am Bar
I am Foo
为什么??
【问题讨论】:
标签: macros metaprogramming elixir