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

问题描述

假设我想在 Scala 3 中使用宏来计算代码中使用某个方法 client.queryMessages(podId: 7) 的位置:

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 函数将打印 0 或 3。如果我能控制这个顺序,我会指示编译器最后编译 // Main.scala object Main { def main(args: Array[String]): Unit = println(Macros.callCount()) } ,这样我就可以得到预期值 3。这可能吗?

解决方法

不,没有办法控制它,你只是不能写那种代码。