¿Hay alguna manera de usar un argumento en una macro en una coincidencia de patrón? Me gustaría hacer esto:macros, empalmes y coincidencias de patrones
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))
}
Pero por desgracia, el compilador dice "requiere identificador estable, pero X.splice encontrado". Normalmente, se podría solucionar esto mediante la asignación a una primera val, tales como:
val XX = X.splice
Pero por supuesto que no funciona con empalme bien.
pero funcionaría si construí el árbol manualmente (es decir, sin reificar)? –
Por cierto, ¿es un error que tenga que usar el c.typeCheck-workaround aquí de nuevo? –
sí, funcionaría con la construcción manual de árboles. hablando de tipocheck, actualmente este es un problema conocido. No sé si tenemos un error para eso, pero definitivamente es algo que me gustaría solucionar. –