章节摘要:主峰之后是横切山脊——编译期元编程与跨语言互操作。宏在编译期生成代码,是把类型系统的表达力再推一层;与 Java、JavaScript 的互操作则是 Scala 能活在真实工程里的原因。本章三节分别讲宏的能力边界、Java 互操作的双向细节与 Scala.js 的前端路线。
金句:宏是"写代码的代码",但它活在编译期——运行时的产物与手写代码毫无区别。
三节同属"越界"主题:宏越过运行期与编译期的界(7.1),后两节越过语言的界(7.2 向 JVM 内的 Java,7.3 向 JVM 外的 JavaScript)。越界能力是 Scala 作为"工程语言"而非"研究语言"的立身之本。
[编译期越界:宏] —— 表达力换复杂度 [语言内越界:Java] —— 生态复用,几乎免费 [语言外越界:Scala.js] —— 平台扩张,类型翻译有价
前置:第五章(宏操作的就是类型与 AST)。延伸:8.1 的构建链路会决定宏的编译顺序;8.3 生态里的 JSON 库派生大量依赖本章的宏。
温度工具走到这里可以分成三层:核心计算(纯 Scala,零依赖)、平台绑定(JVM 服务、浏览器页面、原生可执行各一份)、互操作门面(给 Java 同事的稳定 API)。三层分离后,宏负责消灭核心层的样板代码,互操作章负责把边界收窄到一行转换,Scala.js 负责把同一份核心送进浏览器——山脊横渡的要领从来不是走得快,而是每一步都踩在"类型仍然有效"的岩点上。
三条横渡路线各有装备清单:元编程线只要 Scala 3 编译器自带能力(inline、quotes、derives);JVM 互操作线需要 scala-collection-contrib 与 JDK 并发包的耐心;前端线需要 Scala.js 插件加一个打包器(Vite 或 webpack)。共同点是多一个编译目标就多一份 CI 矩阵——下撤到第八章搭工程时,记得给每条路线单独留一条构建流水线。