代码之家  ›  专栏  ›  技术社区  ›  chenyuandong

Elixir中的元编程

  •  1
  • chenyuandong  · 技术社区  · 7 年前
    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的编译过程弄糊涂了。

    1 回复  |  直到 7 年前
        1
  •  6
  •   Dogbert    7 年前

    我想你应该 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级 首先,然后 BBB中的hh