为什么Elixir Logger由宏组成?

时间:2016-10-23 00:50:45

标签: macros metaprogramming elixir

今天必须在我的某个应用程序中使用#container { text-align:center; } ,并记住I needed to call require Logger first。因此,我决定查看Logger source code,了解为什么Loggerdebuginfo等是宏,而不是简单的函数。

从代码中,errordebug等的宏(甚至它们的底层函数)看起来非常简单。是不是可以简单地将它们作为方法而不是宏来导出?

从记录器代码:

info

从我所看到的情况来看,将它们变成函数而不是宏更简单。

2 个答案:

答案 0 :(得分:4)

这可能是因为__CALLER__特殊形式,它提供了有关调用上下文的信息,包括文件和行,但仅在宏中可用。

答案 1 :(得分:2)

事实证明,另一个原因是,在编译期间可以剥离调用代码以获取应用程序不需要的日志记录级别。

来自ElixirForum discussion

  

允许代码完全不存在用于您不想要的日志记录级别,因此代码永远不会被调用并且不会导致速度损失,因此您只需支付您正在主动记录的日志记录级别。

  

如果使用:compile_time_purge_level

,编译时可以从代码中删除整个Logger调用