宏包

语言
此文档页面特定于 Scala 2 中提供的功能,这些功能已在 Scala 3 中删除或被替代方案取代。除非另有说明,本页面中的所有代码示例均假定你使用的是 Scala 2。

实验性

Eugene Burmako

宏包是 Scala 2.11.x 和 Scala 2.12.x 的一项功能。Scala 2.10.x 中不支持宏包。它们也不受 Scala 2.10.x 的宏天堂支持。

宏包

在 Scala 2.10.x 中,宏实现用函数表示。一旦编译器看到宏定义的应用,它就会调用宏实现 - 如此简单。然而,实践表明,由于以下原因,仅使用函数通常不够

  1. 仅限于函数会使模块化复杂宏变得尴尬。通常会看到宏逻辑集中在宏实现之外的辅助特征中,将实现变成琐碎的包装器,它只是实例化并调用辅助函数。

  2. 此外,由于宏参数依赖于宏上下文的路径,因此需要 特殊咒语 来将实现和辅助函数连接在一起。

宏包通过允许在将 c: scala.reflect.macros.blackbox.Contextc: scala.reflect.macros.whitebox.Context 作为其构造函数参数的类中声明宏实现,为这些问题提供了解决方案,从而使宏实现不必在其签名中声明上下文,这简化了模块化。引用在包中定义的宏实现的方式与在对象中定义的实现相同。你指定一个包名称,然后从中选择一个方法,并在必要时提供类型参数。

import scala.reflect.macros.blackbox.Context

class Impl(val c: Context) {
  def mono = c.literalUnit
  def poly[T: c.WeakTypeTag] = c.literal(c.weakTypeOf[T].toString)
}

object Macros {
  def mono = macro Impl.mono
  def poly[T] = macro Impl.poly[T]
}

黑盒与白盒

宏包可用于实现 黑盒白盒 宏。向宏包构造函数参数提供 scala.reflect.macros.blackbox.Context 类型以定义黑盒宏,并提供 scala.reflect.macros.whitebox.Context 类型以定义白盒宏。

本页面的贡献者