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>