Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/regex/18.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
带正向引用的Scala宏提升表_Scala_Macros - Fatal编程技术网

带正向引用的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-我已经编辑了这个问题-这对你来说够了吗?