首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >从宏调用宏

从宏调用宏
EN

Stack Overflow用户
提问于 2013-06-18 17:10:27
回答 2查看 584关注 0票数 3

我试图从宏调用宏,但我做错了什么。它看起来大致如下:

代码语言:javascript
复制
import play.api.libs.json._
import scala.reflect.macros.Context
import language.experimental.macros

object Extension {

  def apply[A]: Format[A] = macro applyImpl[A]

  def applyImpl[A: c.WeakTypeTag](c: Context): c.Expr[Format[A]] = {
    import c.universe._
    val aTpeW   = c.weakTypeOf[A]
    val aClazz  = aTpeW.typeSymbol.asClass

    if (!aClazz.isSealed) { // fall back to Json.format
      val t = reify { Json.format[A] } .tree
      return c.Expr[Format[A]](t)
    }

    ???
  }
}

换句话说,基于A类型的某些条件,我希望返回另一个宏(Json.format)的主体,而不是在我的宏中生成树。但不知何故,在使用宏之前,它已经扩展了。当我编译这段代码时,我得到

代码语言:javascript
复制
[error] .../Extension.scala:47: No unapply function found
[error]       val t = reify { Json.format[A] } .tree
[error]                                  ^

这意味着format已经被执行了(它不应该被执行)。format方法的定义如下

代码语言:javascript
复制
def format[A] = macro JsMacroImpl.formatImpl[A]
EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2013-06-18 17:11:28

似乎需要直接跳到宏主体中:

代码语言:javascript
复制
if (!aClazz.isSealed) { // fall back to Json.format
  return JsMacroImpl.formatImpl[A](c)
}

(IntelliJ有这个红色,所以我认为它是错误的,但它实际上是编译的)

票数 2
EN

Stack Overflow用户

发布于 2013-06-18 18:46:06

或者,当您将两个宏放在不同的编译单元(即不同的项目)中时,您应该能够从宏调用宏。Scala不能编译宏并在同一编译运行中应用它。

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

https://stackoverflow.com/questions/17164910

复制
相关文章

相似问题

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