单个宏中的多个语句

时间:2016-01-26 13:04:45

标签: erlang

我想定义一些看起来都相同的函数:

info(Message) ->
  report(info, Message, #{}, false).
info(Message, Tags) when is_map(Tags) ->
  report(info, Message, Tags, false);
info(Message, Flush) ->
  report(info, Message, #{}, Flush).
info(Message, Tags, Flush) ->
  report(info, Message, Tags, Flush).
warn(Message) ->
  ...
error(Message) ->
  ...

我可以通过定义3个宏来使这个更好一些:

-define(MK2(Level), 
        Level(Message) -> 
          report(Level, Message, #{}, false)
).
-define(MK3(Level), 
        Level(Message, Tags) when is_map(Tags) ->
          report(Level, Message, Tags, false);
        Level(Message, Flush) ->
          report(Level, Message, #{}, Flush)
).
-define(MK4(Level),
        Level(Message, Tags, Flush) ->
          report(Level, Message, Tags, Flush)
).
?MK2(info).
?MK3(info).
?MK4(info).
?MK2(warn).
?MK3(warn).
?MK4(warn).
?MK2(error).
...

有没有办法进一步压低事情?我希望能够写出像

这样的东西
?MK(info).
?MK(warn).
?MK(error).

1 个答案:

答案 0 :(得分:2)

编译器之类的预处理器适用于以点终止的标记序列。由于函数定义和宏定义都是以点终止的形式,因此无法在宏内部定义具有终止点的函数,因为预处理器将第一个点视为宏的结尾。此外,Erlang邮件列表中的这个thread可能会有所帮助。

如果您没有被迫使用宏,我建议您考虑其他选项,例如使用函数或parse transform