所以, 宏的代码必须想办法将输入的 AST 分解为几个部分并分别计算子表达式.
更多时候, 我们调用了更复杂的 AST 变换....defcast 需要深入输入的 AST 片段, 并找出每个子片段(例如, 函数名, 每个参数)....但是, 您不应该仅仅为了获得一些可爱的 dsl 式语法而选择宏. 在使用宏之前, 应该考虑是否可以依靠“标准”语言抽象(如函数、模块和协议)在运行时有效地解决问题....探索 AST 结构
目前, 关于 AST 结构的文档不多. 然而, 在 shell 会话中可以很简单地探索和使用 AST, 我通常就是这样探索 AST 结构的....因此, 没有这些 guard 语句, 任何双参数的函数调用都会在我们的宏中结束, 这可能是我们不想要的. 使用这个 guard 语句能将输入限制在已知的二进制运算符中.
有趣的事情发生在第 9 行.