以下适用于 2.11.2:
import scala.reflect.macros.Context
object Macros {
def partial: PartialFunction[Int, Int] = macro partialImpl
def partialImpl(c: Context): c.Expr[PartialFunction[Int, Int]]= {
import c.universe._
val cases = cq"x => 1 " :: cq"_ => 0 " :: Nil
val pf = q"{ case ..$cases } : PartialFunction[Int, Int]"
c.Expr[PartialFunction[Int, Int]](pf)
}
}
然后您可以调用Macros.partial(1)
,例如,或Macros.partial.isDefinedAt(2)
。
请注意,为了完成这项工作,我必须PartialFunction[Int, Int]
在 quasiquote中明确使用q"{ case ..$cases } : PartialFunction[Int, Int]"
。如果没有明确的类型定义(否则假设PartialFunction[Any, Int]
),它就无法工作。
这是偏函数的 quasiquote 语法规范。它作为纯语法树工作,但显然不能被解释为类型化表达式PartialFunction[Any, T]
,除非类型被明确表示,否则只能通过宏来解释。