【发布时间】:2018-09-04 00:36:19
【问题描述】:
defmodule BBB do
IO.puts "BBB"
defmacro hh do
IO.puts "hh in BBB"
end
end
defmodule AAA do
IO.puts "AAA"
require BBB
BBB.hh
end
为什么是输出:
BBB
hh in BBB
AAA
我对 Elixir 的编译过程感到很困惑。
【问题讨论】:
defmodule BBB do
IO.puts "BBB"
defmacro hh do
IO.puts "hh in BBB"
end
end
defmodule AAA do
IO.puts "AAA"
require BBB
BBB.hh
end
为什么是输出:
BBB
hh in BBB
AAA
我对 Elixir 的编译过程感到很困惑。
【问题讨论】:
我假设您预计 hh in BBB 会在 AAA 之后。与此相反的原因是因为在编译AAA 时,首先扩展了宏hh。由于hh 直接打印一个值而不是返回打印的带引号的片段,因此它在AAA 模块中的任何表达式执行之前执行。
如果您将hh 更改为普通的def 而不是defmacro:
def hh do
IO.puts "hh in BBB"
end
或者您更改defmacro hh 以返回打印字符串的引用AST:
defmacro hh do
quote do
IO.puts "hh in BBB"
end
end
输出将首先是AAA,然后是hh in BBB。
【讨论】: