c语言中的宏定义:
#define SUM(a, b) (a + b)
程序中就可以用SUM这个求和函数(相当于符号替换),编译器会在编译时将所有出现SUM(a, b)的地方替换成(a + b), 它是个预编译指令,在编译时执行。其实elixir中的宏也具有类似的功能,它能为elixir带来新的特性。比如说elixir中是没有while循环的,如果我们想在elixir中使用while循环怎么办比如说我想用这样一个功能:
while true do
receive do
"break"-> break
_ -> IO.puts "do something else"
end
end
轮询接受消息,当接收到break的消息时就退出while循环(elixir的循环有很多种,关键在于这个break,我们需要一种帮助我们提前结束循环的能力,又不需要附加很多代码,在需要的时候调用break就能跳出循环这是我们所希望有的,虽然这很不函数式)。接下来就用elixir的宏来实现这一功能!首先我们需要一个无限循环(elixir中不直接提供不过我们可以使用Stream.cycle产生无限流)
for _ <- Stream.cycle([:any]) do
nil
end
有了无限循环我们需要一个宏来定义while
defmo