解析Scala宏修改的范围内的变量

时间:2017-08-18 09:21:04

标签: scala macros scala-macros

我正在调查是否可以编译以下类型的导入 在斯卡拉:

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) }

任何想法如何解决这个问题?是否可以使用宏? 或者可能使用编译器插件?

0 个答案:

没有答案