Scala 宏、拼接和模式匹配

Scala 宏、拼接和模式匹配,scala,macros,pattern-matching,scala-2.10,scala-macros,Scala,Macros,Pattern Matching,Scala 2.10,Scala Macros,有没有办法在模式匹配中使用宏的参数?我想这样做: def extr(X:AnyRef) = macro extrImpl def extrImpl(c:Context)(X:c.Expr[AnyRef]):c.Expr[AnyRef] = { import c.universe._ val tree = reify { new { def unapply(x:String):Option[String] = x match { case X.spl

有没有办法在模式匹配中使用宏的参数?我想这样做:

def extr(X:AnyRef) = macro extrImpl

def extrImpl(c:Context)(X:c.Expr[AnyRef]):c.Expr[AnyRef] = {
  import c.universe._

  val tree = reify {
    new {
      def unapply(x:String):Option[String] = x match {
        case X.splice => Some(x) //error
        case _ => None
      }
    }
  }.tree
  c.Expr(c.typeCheck(tree))
}
但不幸的是,编译器说“需要稳定的标识符,但找到了X.splice”。通常情况下,可以通过首先分配val来解决此问题,例如:

val XX = X.splice

当然,这对拼接也不起作用

不幸的是,目前还不可能(在2.10.0-final中也不可能),但我们正在进行一些工作,可能会对后续的point发行版有所帮助:)

但是如果我手动构建树(即,没有具体化),它会起作用吗?顺便说一句,我必须再次使用c.typeCheck-workaround,这是一个bug吗?是的,它可以与手动树构造一起工作。说到类型检查,目前这是一个已知的问题。我不知道我们是否有一个bug,但这肯定是我想要修复的。@EugeneBurmako你介意给出一个简单的例子,说明如何手动构建模式匹配吗?当然,你想让我构建什么树?