【问题标题】:Metaprogramming in ElixirElixir 中的元编程
【发布时间】: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 的编译过程感到很困惑。

【问题讨论】:

    标签: elixir metaprogramming


    【解决方案1】:

    我假设您预计 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

    【讨论】:

      猜你喜欢
      • 2017-03-08
      • 1970-01-01
      • 1970-01-01
      • 2016-01-04
      • 1970-01-01
      • 2017-12-03
      • 1970-01-01
      • 1970-01-01
      • 2016-11-04
      相关资源
      最近更新 更多