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)
}
Этого макрос падает во время макроподстановок со следующей ошибкой:Компилятор сбой в простом макросе манипулируя матч заявление
java.lang.IllegalArgumentException: Could not find proxy for val o7: Some in List(value o7, method apply, <$anon: Function1>, value f, method apply, <$anon: Function1>, method apply, <$anon: Function0>, value <local ApplicativeTest>, object ApplicativeTest, package scalaz, package <root>) (currentOwner= value one)
Это макро точка приложения:
val f = IdiomBracket.control {
a.get match {
case List(one) => one
case _ => ""
}
}
Что нечетное заключается в том, что если вы замените q"Some(List(5)).map{a => $matchz}"
на q"Some($matchz)"
, тогда сбой компилятора исчезнет.
Что вы подразумеваете под восстановлением корпусов. Это также не работает: 'cases.map {case cq" $ x1 => $ x2 "=> cq" $ x1 => $ x2 "}' – jedesah
Кстати, может быть важно отметить, что причина для этого является несоответствием в совпадении шаблонов. Избавьтесь от любой неприменимости, и макрос выше работает отлично. Возможно, мне следовало бы уделять больше внимания этому вопросу. – jedesah
Да, это точка комментария в связанном коде, я думаю. Вы должны деконструировать деревья с помощью SELECTOR_DUMMY. Или, может быть, существует существующий механизм в шаблоне. Я еще не пробовал. –