宏实现是否有可能维持某种形式的全局状态(在整个编译过程中)?具体来说,我想创建一个单独的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给我一些我可以写的对象吗?
答案 0 :(得分:1)
使用object
和var
。只要它所在的文件不使用你的宏,它应该工作。我不确定它是否能保证scalac
能保持单位之间宏的状态,但这似乎对你有用。
object Foo {
def next: Int = macro next_impl
var state = ???;
def next_impl(...): ...
}