2012-09-28 18 views
6

¿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.

Respuesta

2

Desafortunadamente no es posible en este momento (y no será posible en 2.10.0-final), pero tenemos algo en las obras que podrían ayudar en versiones posteriores de puntos :)

+0

pero funcionaría si construí el árbol manualmente (es decir, sin reificar)? –

+0

Por cierto, ¿es un error que tenga que usar el c.typeCheck-workaround aquí de nuevo? –

+1

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. –