2015-10-28 22 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和其他人用来在宏和子项之间进行合作。