应用方法中指定值标签的Scala宏

时间:2014-11-20 09:14:55

标签: scala scala-macros

来自下面的对象Naming(改编自Scala macro get enclosing line中的答案),它收集与值相关联的标签,

val x = Naming.apply("")
x: String = x

希望修改apply方法,以便在Naming获取指定值标签的情况下提供新的assignedName实例,即

val x = Naming()
assert( x.assignedName == "x")

在随后的代码中,naîve会像这样改变

def apply(s: String): String = Naming( macro impl )

无法正常工作。任何实例化assignedName的工作方法都非常有价值。

case class Naming(var assignedName: String = "") {
  val m = collection.mutable.Map[String,Int]()
}

object Naming {

  import scala.language.experimental.macros
  import scala.reflect.macros.Context

  def apply(s: String): String = macro impl 

  def impl(c: Context)(s: c.Expr[String]): c.Expr[String] = {
    import c.universe._

    c.enclosingClass.collect {
      case ValDef(_, name, _, rhs) if rhs.pos == c.macroApplication.pos =>
        c.literal(name.decoded)
    }.headOption.getOrElse(
      c.literal("")
    )
  }

}

更新apply方法中,更新reify Naming实例的assisgnedName可能是一种解决方案。如果可行,怎么能实现呢?

0 个答案:

没有答案