我想定义一些看起来都相同的函数:
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).
答案 0 :(得分:2)
编译器之类的预处理器适用于以点终止的标记序列。由于函数定义和宏定义都是以点终止的形式,因此无法在宏内部定义具有终止点的函数,因为预处理器将第一个点视为宏的结尾。此外,Erlang邮件列表中的这个thread可能会有所帮助。
如果您没有被迫使用宏,我建议您考虑其他选项,例如使用函数或parse transform。