2012-09-28 6 views
6

Gibt es eine Möglichkeit, ein Argument für ein Makro in einer Musterübereinstimmung zu verwenden? Ich möchte, dies tun:Makros, Spleiß und Mustervergleich

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

Aber leider ist die Compiler sagt „stabile Kennung erforderlich, aber X.splice gefunden“. Normalerweise würde man dies löst Erste, der eine val durch die Zuordnung, wie zB:

val XX = X.splice 

Aber das ist natürlich nicht mit Spleiß entweder nicht funktioniert.

Antwort

2

es ist leider im Moment nicht möglich (und wird in 2.10.0 Final nicht möglich sein), aber wir haben etwas Arbeiten, die in den nachfolgenden Punkt Mitteilungen helfen könnte :)

+0

aber es funktionieren würde, wenn ich gebaut der Baum manuell (dh ohne zu verifizieren)? –

+0

BTW, ist es ein Fehler, dass ich die c.typeCheck-Problemumgehung hier wieder verwenden muss? –

+1

Ja, es würde mit der manuellen Baumkonstruktion funktionieren. Wenn man von Typcheck spricht, ist dies zur Zeit ein bekanntes Problem. Ich weiß nicht, ob wir dafür einen Bug haben, aber das möchte ich definitiv beheben. –