Elixir中的元编程

che*_*ong 1 metaprogramming 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
Run Code Online (Sandbox Code Playgroud)

为什么输出:

BBB
hh in BBB
AAA
Run Code Online (Sandbox Code Playgroud)

我对Elixir的编译过程感到困惑.

Dog*_*ert 6

我假设你有望hh in BBB继续AAA.与之相反的原因是因为AAA编译时,hh首先扩展宏.由于hh直接打印值而不是返回打印的带引号的片段,因此在执行AAA模块中的任何表达式之前执行它.

如果您更改hh为正常def而不是defmacro:

def hh do
  IO.puts "hh in BBB"
end
Run Code Online (Sandbox Code Playgroud)

或者你更改defmacro hh为返回引用的AST,它打印字符串:

defmacro hh do
  quote do
    IO.puts "hh in BBB"
  end
end
Run Code Online (Sandbox Code Playgroud)

输出将是AAA第一个然后hh in BBB.