Scala 操作匹配语句的简单宏中的编译器崩溃

Scala 操作匹配语句的简单宏中的编译器崩溃,scala,pattern-matching,scala-macros,Scala,Pattern Matching,Scala Macros,此宏在宏扩展期间崩溃,并出现以下错误: def control(x: String): Option[String] = macro controlImpl def controlImpl(c: Context)(x: c.Expr[String]): c.Expr[Option[String]] = { import c.universe._ val result = x.tree match { case Match(expr, cases) =>

此宏在宏扩展期间崩溃,并出现以下错误:

def control(x: String): Option[String] = macro controlImpl
def controlImpl(c: Context)(x: c.Expr[String]): c.Expr[Option[String]] = {
    import c.universe._
    val result = x.tree match {
        case Match(expr, cases) =>
            val matchz = Match(q"""List("hello")""", cases)
            q"Some(List(5)).map{a => $matchz}"
        case a => a
    }
    c.Expr[Option[String]](result)
}
奇怪的是,如果用
q“Some($matchz)”
替换
q“Some(List(5)).map{a=>$matchz}
,编译器崩溃就会消失。

简单宏”是一个矛盾修饰法

碰撞发生在lambda电梯中,这表明车主的标志不正确

您可以使用
-Ybrowse:typer
检查生成的树

考虑一下你想要生产什么:

val f = IdiomBracket.control {
    a.get match {
        case List(one) => one
        case _ => ""
    }
}
案例中的var由您要创建的anonfun所有:

class X {
  //def g = List("hello") match { case List(x) => x case _ => "" }
  def f = Some(List(5)).map{a => List("hello") match { case List(x) => x case _ => "" } }
}
您的实际结果:

Symbol: [has] value x
Symbol owner: value $anonfun
Symbol:[具有]值x
符号所有者:值
其中
Controlled
是我的示例,它包含了代码的对象

您可能需要重新生成案例,而不仅仅是
案例映射(\uu.untypecheck)


您所说的重建案例是什么意思。这也不起作用:
cases.map{case cq“$x1=>$x2”=>cq“$x1=>$x2”}
Btw,可能需要注意的是,造成这种情况的“原因”是模式匹配中不适用的。摆脱任何不适用的宏,上述宏工作正常。也许我应该在问题中更加强调这一点。是的,我认为这是链接代码中注释的重点。你必须用选择器来解构这些树。或者模式匹配器中存在一种机制。我还没试过。
Symbol: [has] value x
Symbol owner: value $anonfun
Symbol: [has] value x
Symbol owner: value <local Controlled>