追踪函数调用
在本文中, 我们将创建一个宏 deftraceable, 它允许我们定义可跟踪的函数. 可跟踪函数的工作方式与普通函数一样, 但每当我们调用它时, 都会打印出调试信息....宏有助于减少这些噪声, 但在使用宏之前, 请先考虑是否可以使用运行时结构(函数, 模块, 协议)来解决重复.
看完这个长长的免责声明, 让我们开始实现 deftraceable吧....我通常依靠 IO.inspect和 Macro.to_string/1 来验证中间结果, 一旦我满意了, 我会删除 nil 部分, 看看是否能工作....然而, 我应该立即指出, 这种实现存在一些问题:
宏不能很好地处理守卫(guards)
模式匹配参数并不总是有效的(例如, 当使用 _ 来匹配任何 term 时)
在模块中直接动态生成代码时, 宏不起作用...毕竟, 宏只是一个函数, 当调用它时, 包含的模块已经编译并加载到编译器的 VM 中(否则, 宏无法运行).