Этот вопрос похож по мотивам моего предыдущего вопроса (хотя он касается проблемы, с которой я столкнулся в другой контекст).
Я могу легко сопоставлять совпадение в литерале функции без квазиквадратов:
import scala.reflect.macros.Context
import scala.language.experimental.macros
object QQExample {
def funcDemo(f: Int => String) = macro funcDemo_impl
def funcDemo_impl(c: Context)(f: c.Expr[Int => String]) = {
import c.universe._
f.tree match {
case Function(ps, body) => List(ps, body) foreach println
case _ => c.abort(
c.enclosingPosition,
"Must provide a function literal."
)
}
c.literalUnit
}
}
Что работает следующим образом:
scala> QQExample.funcDemo((a: Int) => a.toString)
List(val a: Int = _)
a.toString()
Теперь предположим, что я хочу использовать квазивоты, чтобы сделать такой же тип соответствия более гибким. Следующее будет также соответствовать этой функции и печатает то, что мы ожидаем.
case q"($x: $t) => $body" => List(x, t, body) foreach println
Но если я хочу указать тип в шаблоне, он не соответствует:
case q"($x: Int) => $body" => List(x, body) foreach println
И ни одно из следующего не компилируется:
case q"$p => $body" => List(p, body) foreach println
case q"($p) => $body" => List(p, body) foreach println
case q"..$ps => $body" => List(ps, body) foreach println
case q"(..$ps) => $body" => List(ps, body) foreach println
Можно ли указать тип параметра при сопоставлении в литерале функции с квазикварталами или совпадение по неизвестному числу параметров?