我可以控制在 Scala 3 中编译宏的顺序吗?

Can I control the order in which macros are compiled in Scala 3?

假设我想在 Scala 3 中使用宏来计算代码中使用某种方法 doSomething() 的位置数:

// Macros.scala

import scala.quoted.{Expr, Quotes}

object Macros {
  private var count: Int = 0

  inline def doSomething() = ${increment()}

  private def increment()(using Quotes) =
    count = count + 1
    Expr("some result")
    
  inline def callCount() = ${getCount()}
  
  private def getCount()(using Quotes) =
    Expr(count)
}

我有一个使用了几次 doSomething() 的对象:

// Runner.scala

object Runner {
  def run() =
    Macros.doSomething()
    Macros.doSomething()
    Macros.doSomething()
}

我想在运行时显示调用计数:

// Main.scala

object Main {
  def main(args: Array[String]): Unit =
    println(Macros.callCount())
}

根据编译这些宏的顺序,主函数将打印 0 或 3。如果我能控制这个顺序,我会指示编译器最后编译 Main.scala,这样我得到期望值3。这可能吗?

不行,没办法控制,就是不能写那种代码。