【发布时间】:2017-03-05 01:19:28
【问题描述】:
今天不得不在我的一个应用程序中使用Logger,并记得I needed to call require Logger first。所以我决定看一下Logger source code,看看为什么debug、info、error等是宏而不是简单的函数。
从代码来看,debug、info 等的宏(甚至它们的底层函数)看起来非常简单。难道不能简单地将它们导出为方法而不是宏吗?
来自 Logger 代码:
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
据我所知,将它们变成函数而不是宏会更简单。
【问题讨论】:
标签: macros metaprogramming elixir