在稱為巨集展開的編譯器階段執行對巨集方法的呼叫,以產生程式的一部分,即抽象語法樹。
Scala 2.13 巨集 API 與 Scala 2.13 編譯器內部緊密結合。因此,Scala 3 編譯器無法展開任何 Scala 2.13 巨集。
相反地,Scala 3 導入了一種新的、經過設計以確保穩定的元程式設計原則。Scala 3 巨集和一般內嵌方法將與 Scala 3 編譯器的未來版本相容。雖然這是一個無可爭議的進步,但也表示所有 Scala 2.13 巨集都必須使用新的元程式設計功能從頭改寫。
巨集依賴關係
即使 Scala 3 模組包含巨集定義,它也可以依賴於 Scala 2.13 人工製品,但編譯器將無法展開其巨集。當您嘗試時,它只會傳回錯誤。
-- Error: /src/main/scala/example/Example.scala:10:45
10 | val documentFormat = Json.format[Document]
| ^
|Scala 2 macro cannot be used in Scala 3. See https://dotty.epfl.ch/docs/reference/dropped-features/macros.html
|To turn this error into a warning, pass -Xignore-scala2-macros to the compiler
請注意,使用 -Xignore-scala2-macros
有助於類型檢查程式碼,但它會產生不完整的類別檔案。
當此錯誤出現在您的專案中時,您最終別無選擇,只能升級到巨集人工製品的 Scala 3 編譯版本。
移植巨集生態系統
雖然是實驗性的,但 Scala 社群已在多種方式中廣泛採用 Scala 2 巨集功能:程式碼產生、最佳化、符合人體工學的 DSL…
生態系統的很大一部分現在依賴於外部函式庫中定義的 Scala 2.13 巨集。找出並移植這些函式庫是推動生態系統向前發展的關鍵。
許多開源巨集函式庫的遷移狀態可在 此頁面 中找到。
重寫巨集
新的元程式設計功能與 Scala 2 完全不同。它們包含
在深入重新實作巨集之前,您應該問自己
- 我可以使用
inline
和scala.compiletime
運算來重新實作我的邏輯嗎? - 我可以使用更簡單、更安全的基於表達式的巨集嗎?
- 我是否真的需要存取 AST?
- 我可以使用 比對類型 作為回傳類型嗎?
您可以透過閱讀 Scala 3 中的巨集 教學課程來學習所有新的元程式設計概念。
跨建構巨集函式庫
您已撰寫一個很棒的巨集函式庫,您希望它可以在 Scala 2.13 和 Scala 3 中使用。有兩種不同的方法,傳統的跨建構技術和更靈活的巨集混合技術。
巨集混合的優點是,利用 -Ytasty-reader
選項的使用者仍然可以使用您的巨集。
您可以透過閱讀這些教學課程來了解它們
其他資源
部落格文章和演講
早期採用專案
此頁面的貢獻者
內容
- 相容性參考
- 原始碼層級
- 類別路徑層級
- 執行時期
- 元程式設計
- 遷移工具巡禮
- Scala 2 搭配 -Xsource:3
- Scala 3 遷移模式
- 遷移教學
- 先備條件
- 移植 sbt 專案(使用 sbt-scala3-migrate)
- 移植 sbt 專案(手動)
- 跨建構巨集函式庫
- 混合 Scala 2.13 和 Scala 3 巨集
- Scala 3 語法重寫
- 不相容性表格
- 語法變更
- 已移除功能
- 脈絡抽象
- 其他已變更功能
- 類型檢查器
- 類型推論
- 編譯器選項
- 編譯器選項查詢表
- 新的編譯器選項
- Scala2 和 Scala3 之間的 Scaladoc 設定相容性
- 編譯器外掛程式
- Kind Projector 遷移
- 外部資源