2012-09-28 8 views
6

パターンマッチでマクロに引数を使用する方法はありますか?マクロ、スプライス、パターンマッチング

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 XX = X.splice 

しかし、いずれかのスプライスでは動作しませんもちろん:通常、1のような、最初のvalに割り当てることによって、これを解決するだろう。

答えて

2

残念ながら、それは今はできません(と2.10.0-決勝で行うことはできません)が、我々は、その後のポイントリリースに役立つかもしれない作品に何か:)

+0

を持っていますが、私は構築した場合、それがうまくいきます手作業で樹木を樹立することはできませんか? –

+0

btw、これはもうc.typeCheckの回避策を使用しなければならないバグでしょうか? –

+1

はい、手動の木構造で動作します。 typecheckと言えば、現在これは既知の問題です。私はバグがあるかどうかはわかりませんが、それは間違いなく私が修正したいことです。 –