我可以控制在 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。这可能吗?
不行,没办法控制,就是不能写那种代码。
假设我想在 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。这可能吗?
不行,没办法控制,就是不能写那种代码。