我正在调查是否可以编译以下类型的导入 在斯卡拉:
def helpers[T] = new { def foo: T = ??? }
import helpers[Int]._
这是一个想法,可以确定Scala可以使用的某些类型 不能自己推断。 手动扩展版本有效:
val m = helpers[Int]
import m._
(foo: Int)
然而,我对宏的天真尝试失败了:
import scala.reflect.macros.blackbox.Context
object Open {
def open[T](m: Any)(t: T): T = macro open_impl[T]
def open_impl[T](c: Context)(m: c.Tree)(t: c.Tree): c.Tree = {
import c.universe._
val freshName = TermName(c.freshName("import$"))
q"{ val $freshName = $m; import $freshName._; $t }"
}
}
我想到的语法是来自OCaml的let open M in
- 语法。
问题是变量的绑定似乎发生在之前
宏观扩张:
import Open._
object Foo { val x = 7 }
open(Foo) { println(x) }
在REPL中失败:
<console>:16: error: not found: value x
open(Foo) { println(x) }
任何想法如何解决这个问题?是否可以使用宏? 或者可能使用编译器插件?