首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >在宏中推迟隐式分辨率

在宏中推迟隐式分辨率
EN

Stack Overflow用户
提问于 2015-10-28 19:04:35
回答 1查看 142关注 0票数 0

所以,让我说我手头上有几件事:

代码语言:javascript
复制
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] = ???

我想做:

代码语言:javascript
复制
ma(tpAware)

其中定义了applyImpl,如下所示

代码语言:javascript
复制
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 a@Apply(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
}

现在的问题是,类型程序在展开宏之前运行,而在应用Context[A]之前,我的apply是不可见的。

干吗?

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2015-10-29 01:44:09

与将隐式参数注入参数列表不同,唯一可行的方法是创建@compileTimeOnly函数,该函数将由apply宏注入替代的AST。

@compileTimeOnly函数的参数列表将被拼接到生成的AST中,生成的AST将拼接到整个程序中。

必须特别注意修复生成和拼接的语法树的符号所有权和类型检查。有关如何正确修复树的更多信息,请参见macrology201第1部分,步骤19至30。

此方法用于Scala-异步、sbt和其他宏及其子级之间的协作。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/33399518

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档