巨集

巨集套件

語言
此文件頁面專門針對 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類型,以定義白盒巨集。

此頁面的貢獻者