Scala宏-存储全局状态?

Scala宏-存储全局状态?,scala,macros,Scala,Macros,宏实现是否可以维护某种形式的全局状态(在整个编译运行期间)?具体地说,我想创建一个独立的IMain实例,但我不想在每个宏扩展中都重新创建它,所以我希望有一个lazy val、ThreadLocal或任何可以缓存该实例的形式。为简单起见,假设我想在编译过程中在同一宏的所有扩展之间共享一个对象: object Foo { def next: Int = macro ??? } trait Test { val a = Foo.next val b = Foo.next val c

宏实现是否可以维护某种形式的全局状态(在整个编译运行期间)?具体地说,我想创建一个独立的
IMain
实例,但我不想在每个宏扩展中都重新创建它,所以我希望有一个
lazy val
ThreadLocal
或任何可以缓存该实例的形式。为简单起见,假设我想在编译过程中在同一宏的所有扩展之间共享一个对象:

object Foo {
  def next: Int = macro ???
}

trait Test {
  val a = Foo.next
  val b = Foo.next
  val c = Foo.next
  assert(a == 1 && b == 2 && c == 3)
}
由于在实际情况中,状态非常复杂且不可序列化,因此无法读取和写入磁盘


我似乎无法通过提供的唯一上下文(
scala.reflect.macros.blackbox.context
)实现这一点。这是否意味着我必须编写一个完整的编译器插件?我能骗sbt给我一些可以写入的对象吗?

使用
对象和
var
。只要它所在的文件不使用宏,它就可以工作。我不确定它是否能保证
scalac
在任何地方都能在单元之间保持宏的状态,但这似乎对您有效

object Foo {
  def next: Int = macro next_impl
  var state = ???;
  def next_impl(...): ...
}

完全猜测,但是
对象中的
var
与宏在同一个单元中起作用吗?@HTNW哦,太棒了,太简单了,是的!请你发个帖子作为答复好吗?