Macros Elixir宏重写模块方法和使用宏的全局

Macros Elixir宏重写模块方法和使用宏的全局,macros,elixir,Macros,Elixir,使用elixir的\uuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuu宏,并借助\uuuuuuuuuuuuuu定义\uuuuuuuuuuuuuuuuuuu我可以跟踪模块中的所有方法。我想做的是用其他实现替换模块中的所有方法。现在创建我想要的新方法非常简单,但是我还想删除现有的方法 除此之外,还有一种方法可以将宏应用于多个模块,而无需向每个模块明确添加use XXX。换句话说,如果我有一个文件夹结构: 福/ 酒吧/ 模块1.ex 模块2.ex 我是否可以使用宏对/fo

使用elixir的
\uuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuu宏,并借助
\uuuuuuuuuuuuuu定义\uuuuuuuuuuuuuuuuuuu
我可以跟踪模块中的所有方法。我想做的是用其他实现替换模块中的所有方法。现在创建我想要的新方法非常简单,但是我还想删除现有的方法

除此之外,还有一种方法可以将宏应用于多个模块,而无需向每个模块明确添加
use XXX
。换句话说,如果我有一个文件夹结构:

  • 福/
    • 酒吧/
      • 模块1.ex
      • 模块2.ex
我是否可以使用
宏对
/foo/bar/
中的所有内容动态应用


为了简化我的问题,想象一下,对于
foo/bar/
文件夹中所有模块中的所有方法,我想更改它们的实现,以便它们首先运行
IO.inspect“called before method”
,也就是某种before方法aop

def
只是
内核中的一个宏。因此,您可以使用
import内核排除它,除了:[def:2]
,然后创建
def
。除了返回值之外,这里有些东西几乎可以工作

defmodule Def do
  import Kernel, except: [def: 2]
  defmacro __using__(_) do
    quote do
      import Kernel, except: [def: 2]
    end
  end

  defmacro def(call, expr) do
    # caller = __CALLER__
    # IO.inspect call
    # IO.inspect expr

    # import Kernel
    quote do
      Kernel.def unquote(call) do
        IO.puts "do something first"
        unquote(expr)
      end
    end
  end
end

defmodule Special do
  use Def
  import Def

  def test(one, two) do
    IO.puts "one: #{inspect one}, two: #{inspect two}"
  end
end
在iex中运行

Interactive Elixir (1.4.2) - press Ctrl+C to exit (type h() ENTER for help)
iex(1)> Special.test 1, 2
do something first
one: 1, two: 2
[do: :ok]
iex(2)>
我在自定义
def
宏的顶部留下了一些打印语句。您可以使用它来检查新的
def
宏输入的AST

您可以在源代码中找到更多信息


我没有想到一种方法可以同时自动将
use
应用于多个模块。如果我有什么想法,我会回来更新的。

嘿,史蒂夫,谢谢你的回复,我知道我可以重新定义def。我真正想问的是,是否有可能不必明确添加using。如果我只是说给定一个目录,我可以挂接到编译器中来更改目录中的所有模块,而无需显式调用模块代码本身中的using或任何宏,这可能会更容易。