Я хотел бы переписать partial function
в выражение match
.
//macro and impl
def pfRewrite(pf: PartialFunction[Int, Int]) = macro ResponderImpl.pfRewriteImpl
def pfRewriteImpl(c: Context)(pf: c.Expr[PartialFunction[Int, Int]]) = {
import c.universe._
val cas = pf.tree.collect {
case x: DefDef if x.name.decoded == "applyOrElse" =>
x.collect {
case cq"$x => $y" => cq"""$x => $y"""
}
}.flatten
val sVal = newTermName("someVal")
val rewrite = q"""
$sVal match {
case ..$cas
}
"""
c.Expr(rewrite)
}
В коде я получил PartialFunction
и взял метод cases
из applyOrElse
, затем я создал выражение match
для "someVal". Это значение из кода:
//test
def test {
val someVal = 10
pfRewrite {
case 1 => 10
case _ => 100
}
}
Но я получил ошибки:
[error] found : Int(10)
[error] required: Nothing
[error] case 1 => 10
[error] ^
и так далее.
Можно ли переписать частичный вызов функции в match ?
someVal
в качестве параметров метода:def mth(s: Int) = { pfRewrite { case 1 => 10 ; case _ => 100 } }
преобразуется вmth(s: Int) = { s match { ... } }
. Или что вы имеете в виду? - person mike   schedule 11.03.2014resetLocalAttrs
.s
— это имя атрибута. Теперь я хочу переписатьcase
блоков -case x: Int => x
перевести вcase x: Int => x + 100
. Это возможно или это сложно? - person mike   schedule 12.03.2014s
. Не могли бы вы уточнить? - person Eugene Burmako   schedule 12.03.2014