在编译之前修改Elixir模块的AST

时间:2017-05-30 19:38:10

标签: elixir metaprogramming

您好我想构建一个库,用其他函数调用替换某些函数调用。

module A do
  def wrapper
    B.foo
  end
end

在已编译的程序中,A.wrapper实际上会调用B.baz。我已经偶然发现@before_compile回调,但似乎无法改变调用模块的AST。

所以我得到的就是这个

module A do
  use Modifier
  @before_compile Modifier

  def wrapper
    B.foo
  end
end

defmodule Modifier do
  defmacro __before_compile__(env) do
    # Now what?
  end
end

2 个答案:

答案 0 :(得分:0)

我认为你正在寻找defdelegate/2

你也可以创建一个宏:

defmodule Mofifier do
  defmacro __using__(_) do
    quote do
      import unquote(__MODULE__)
    end
  end

  defmacro wrapper do
    quote do
      B.foo
    end
  end
end

defmodule A do
  use Modifier

  def something, do: wrapper()
end

答案 1 :(得分:0)

验证@on_definition属性是否符合您的目的here。很有可能。