你不需要设计这样的宏, 因为 Erlang 已经有非常强大的跟踪功能, 而且有一个 Elixir 包可用. 然而, 这个例子很有趣, 因为它需要一些更深层次的 AST 转换技巧....例如, 如果在 Erlang 中没有跟踪功能, 我们就需要设计一些宏来帮助我们(实际上不需要类似上述的例子, 但那是另外一个话题), 否则我们的代码就会有大量重复的模板代码....我们从编译器环境中获取各种数据, 然后计算结果, 最后将所有内容打印到屏幕上.
该代码依赖于 __ENV__ 特殊形式, 可用于在最终 AST 中注入各种编译时信息(例如行号和文件)....基本上, 我从定义一个宏开始:
defmacro deftraceable(arg1) do
IO.inspect arg1
nil
end
然后我尝试从一些测试模块或 shell 中调用宏....我将通过向宏定义中添加另一个参数来测试. 一旦我得到结果, 我会试图找出参数表示什么, 然后开始构建宏.
宏结束处的 nil 确保我们不生成任何东西(我们生成的 nil 通常与调用者代码无关).