你不需要设计这样的宏, 因为 Erlang 已经有非常强大的跟踪功能, 而且有一个 Elixir 包可用. 然而, 这个例子很有趣, 因为它需要一些更深层次的 AST 转换技巧....在开始之前, 我要再提一次, 你应该仔细考虑你是否真的需要这样的结构. 例如 deftraceable 这样的宏引入了一个每个代码维护者都需要了解的东西. 看着代码, 它背后发生的事不是显而易见的....但是在适合使用宏的情况下, 你不应该仅仅因为有人声称宏是不好的, 就不使用它....宏有助于减少这些噪声, 但在使用宏之前, 请先考虑是否可以使用运行时结构(函数, 模块, 协议)来解决重复.
看完这个长长的免责声明, 让我们开始实现 deftraceable吧...., 有一个 Macro.decompose_call/1 的辅助功能函数可以帮我们做到.