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