4.3.1.2 强大的宏展开能力 你有没有在深夜调试一个看似无害的宏,却眼睁睁看着它把整个编译器拖进无限递归的深渊? 有没有写过一段自以为优雅的 ,结果在 REPL 里 时,展开结果像被揉皱又泡过水的纸——变量名全乱了、作用域塌缩了、甚至凭空冒出几个根本没定义的符号? 有没有在团队代码审查中,被同事指着一行 质问:“这宏到底展开成什么?我怎么敢把它放进支付路径?” 这不是玄学。这是宏展开能力的真实战场——不是教科书里“宏是编译期代码生成”的轻描淡写,而是当 遇上 、当 模式匹配撞上 、当 hygiene 与非 hygiene 的边界在毫秒级展开中悄然撕裂时,工程师必须亲手按住的那根高压线。 我们不谈哲学。不讲“Lisp 是元语言”这种正确但空洞的断言。