Scala宏 - 存储全局状态?

时间:2017-08-31 13:31:11

标签: scala macros

宏实现是否有可能维持某种形式的全局状态(在整个编译过程中)?具体来说,我想创建一个单独的IMain实例,但我不想在每次宏扩展中重新创建它,所以我想要一个lazy val,{{ 1}}或我可以缓存该实例的任何内容。为简单起见,想象一下我想在编译期间在同一个宏的所有扩展之间共享一个对象:

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) } 找到任何方法来实现这一目标。这是否意味着我必须编写一个完整的编译器插件?我可以欺骗sbt给我一些我可以写的对象吗?

1 个答案:

答案 0 :(得分:1)

使用objectvar。只要它所在的文件不使用你的宏,它应该工作。我不确定它是否能保证scalac能保持单位之间宏的状态,但这似乎对你有用。

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