元编程
以下页面介绍了 Scala 中元编程的重新设计。它们介绍了以下基本设施
-
inline
是一种新的修饰符,它保证定义将在使用点内联。内联背后的主要动机是减少函数调用和值访问的开销。扩展将由 Scala 编译器在Typer
编译器阶段执行。与其他一些生态系统中的内联不同,Scala 中的内联不仅仅是对编译器的请求,而是一个命令。原因是 Scala 中的内联可以驱动其他编译时操作,如内联模式匹配(启用类型级编程)、宏(启用编译时、生成式、元编程)和运行时代码生成(多阶段编程)。 -
编译时操作 是标准库中的帮助程序定义,它为值和类型提供编译时操作支持。
-
宏建立在两个众所周知的、基本的操作之上:引用和拼接。引用将程序代码转换为数据,具体来说,是此代码的(树状)表示形式。它表示为表达式的
'{...}
和类型的'[...]
。拼接表示为${ ... }
,它反其道而行之:它将程序的表示形式转换为程序代码。结合inline
,这两个抽象允许以编程方式构建程序代码。 -
运行时阶段 宏在编译时构建代码,而阶段允许程序在运行时构建新代码。这样,代码生成不仅可以依赖于静态数据,还可以依赖于运行时可用的数据。这将程序的评估分成两个或更多阶段或...阶段。因此,这种生成式编程方法被称为“多阶段编程”。阶段建立在与宏相同的基础之上。它使用引用和拼接,但省略了
inline
。 -
反射 引用是代码的“黑盒”表示形式。它们可以使用拼接进行参数化和组合,但它们的结构无法从外部进行分析。TASTy 反射通过在标准 API 中部分揭示代码片段的表示形式类型,提供了一种分析代码结构的方法。表示形式类型是一种typed abstract syntax tree,由此产生了
TASTy
单词。 -
TASTy 检查 类型的抽象语法树序列化为存储在
.tasty
文件中的自定义压缩二进制格式。TASTy 检查允许加载这些文件并分析其内容的树结构。