带正向引用的Scala宏提升表
我大致有以下代码:带正向引用的Scala宏提升表,scala,macros,Scala,Macros,我大致有以下代码: object MyObj { def callWithParams(params: List[Param]): String = "some string" } sealed trait Param case class Single(id: Int) extends Param case class Group(id: Int, subParams: List[Param]) extends Param def buildMyParams(): List[Param
object MyObj {
def callWithParams(params: List[Param]): String = "some string"
}
sealed trait Param
case class Single(id: Int) extends Param
case class Group(id: Int, subParams: List[Param]) extends Param
def buildMyParams(): List[Param] = List(Single(1), Group(2, List(Group(3, Single(4))))
def macroImpl(c: blackbox.Context): c.Expr[String] = {
import c.universe._
// TODO: need a implicit Lift[Param] implementation here
val myParams = buildMyParams()
c.Expr[String](q"MyObj.callWithParams($myParams)")
}
我对隐式列表[Param]
的尝试是:
implicit val lift = Liftable[Param]({
case s: Single => q"Single(${s.id})"
case g: Group => q"Group(${g.id}, ${g.subParams})"
})
由于组的子参数
,因此在尝试提升组时,提升表
中存在正向引用,因此无法编译此代码
如何解决此问题?将升降机声明为def而不是val足以解决此问题:
implicit def lift = Liftable[Param]({
case s: Single => q"Single(${s.id})"
case g: Group => q"Group(${g.id}, ${g.subParams})"
})
你能发布整个宏代码吗?我认为你只需要使用shapeless。Lazy@Edmondo1984-我已经编辑了这个问题-这对你来说够了吗?