2015-10-28 43 views
0

因此,可以說我的手之前,有幾件事情:推遲隱式解析,在宏

case class M[A](val value: A) { 
    def apply(as: M[A]*) = macro applyImpl[A] 
} 

def tpAware(implicit ev: Context[A]): M[A] 

val ma: M[X] = ??? 

我想做的事:

ma(tpAware) 

applyImpl定義類似

def applyVG[A : c.WeakTypeTag, V](c: MacroContext)(vs: c.Expr[M[V]]*): c.Expr[M[A]] = { 
    import c.universe._ 
    val container = c.prefix.tree.collect { 
    case [email protected](n, xs) => xs 
    }.flatten.apply(1) 

    val expr = reify { 
    M { 
     implicit val ev = Context[A]() 
     val container = c.Expr[A](container).splice 
     sequence(c)(vs).splice foreach { c => 
     container.add(c.value) 
     } 
     container 
    } 
    } 
    expr 
} 

現在的問題是typer在宏展開前運行,而我的Context[A]不是vis在應用012ble

之前可以嗎?

回答

1

與其向參數列表中注入隱式參數,唯一可行的方法是創建@compileTimeOnly函數,這些函數將由apply宏在其位置注入替代AST。

@compileTimeOnly函數的參數列表將被拼接到生成的AST中,生成的AST將被拼接到整個程序中。

必須特別注意修復生成和拼接的語法樹的符號所有權和類型檢查。有關如何正確修復樹木的更多信息,請參閱macrology201第1部分的步驟19至30。

這種方法被scala-async,sbt和其他人用來在宏和子項之間進行合作。