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的编译过程感到困惑.
我假设你有望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.
| 归档时间: |
|
| 查看次数: |
55 次 |
| 最近记录: |