小编moc*_*cos的帖子

Elixir 1.3 中的宏和模块属性

Elixir 1.3.0-rc1 编译器无法编译我的宏之一。在 Elixir 1.2.6 中还可以。

defmodule M do
  defmacro ifa(a, exp) do
    if (Macro.expand_once(a, __ENV__)), do: exp
  end
end

defmodule Foo do
  @flag true

  require M
  def main do
    M.ifa (@flag), do: IO.puts 123
  end
end

Foo.main
Run Code Online (Sandbox Code Playgroud)

编译器抱怨该属性。

% /tmp/elixir-1.3.0-rc1/bin/elixir foobar.exs
** (ArgumentError) could not call get_attribute on module M because it was already compiled
    (elixir) lib/module.ex:1144: Module.assert_not_compiled!/2
    (elixir) lib/module.ex:1066: Module.get_attribute/3
    (elixir) lib/kernel.ex:2360: Kernel.do_at/4
    (elixir) expanding macro: Kernel.@/1
    foobar.exs:12: M.ifa/2
    expanding macro: M.ifa/2
    foobar.exs:12: Foo.main/0


% /tmp/elixir-1.2.6/bin/elixir foobar.exs
123 …
Run Code Online (Sandbox Code Playgroud)

macros elixir

1
推荐指数
1
解决办法
868
查看次数

标签 统计

elixir ×1

macros ×1