Macros 为什么Elixir Logger由宏组成?

Macros 为什么Elixir Logger由宏组成?,macros,metaprogramming,elixir,Macros,Metaprogramming,Elixir,今天在我的一个应用程序中使用了记录器,并且记住了这一点。所以我决定看一下,看看为什么debug、info、error等都是宏,而不是简单的函数 从代码来看,debug、info等宏(甚至它们的底层函数)看起来非常简单。难道不能简单地将它们导出为方法而不是宏吗 从记录器代码: defmacro log(level, chardata_or_fn, metadata \\ []) do macro_log(level, chardata_or_fn, metadata, __CALLE

今天在我的一个应用程序中使用了
记录器
,并且记住了这一点。所以我决定看一下,看看为什么
debug
info
error
等都是宏,而不是简单的函数

从代码来看,
debug
info
等宏(甚至它们的底层函数)看起来非常简单。难道不能简单地将它们导出为方法而不是宏吗


从记录器代码:

  defmacro log(level, chardata_or_fn, metadata \\ []) do
    macro_log(level, chardata_or_fn, metadata, __CALLER__)
  end

  defp macro_log(level, data, metadata, caller) do
    %{module: module, function: fun, file: file, line: line} = caller

    caller =
      compile_time_application ++
        [module: module, function: form_fa(fun), file: file, line: line]

    quote do
      Logger.bare_log(unquote(level), unquote(data), unquote(caller) ++ unquote(metadata))
    end
end

据我所见,将它们变成函数而不是宏会更简单。

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

结果,另一个原因是,可以在编译时剥离调用代码,以获得应用程序不需要的日志记录级别

从:

它允许代码完全不存在于您不想要的日志记录级别,因此该代码甚至不会被调用,也不会导致速度损失,因此您只需为您正在积极记录的日志记录级别付费

如果您使用
:compile\u time\u purge\u level


是的,检查一下
\uuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuu
文档,这很有意义。我只是假设它类似于
\uuuuu DIR\uuuuu
,可以在任何地方访问。此外,宏允许您使用请求的日志级别进行编译。使用日志级别
error
编译时,所有调试日志调用都将从编译文件中完全删除。没有“if log_level>something”,这使得它的速度非常快。