Nat*_*ska 9 scala scala-macros scala-quasiquotes
我是scala宏的新手,我花了几天时间试着写第一篇.我有quasiquotes连接问题.
有一个案例条款列表,让我们说如下:
val cases = cq"x => 1 " :: cq"_ => 0 " :: Nil
Run Code Online (Sandbox Code Playgroud)
我需要从中构建一个部分功能.问题是我不知道如何将它们粘贴到最终的quasiquote中.文档说我应该做这样的事情:
q"{ case ..$cases }"
Run Code Online (Sandbox Code Playgroud)
但如果我这样做,它就不起作用.
有没有办法从这样的列表构建PartialFunction?
谢谢你的帮助.
以下内容适用于 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)
}
}
Run Code Online (Sandbox Code Playgroud)
然后您可以调用Macros.partial(1),例如,或Macros.partial.isDefinedAt(2)。
请注意,为了使这项工作正常进行,我必须PartialFunction[Int, Int]在 quasiquote 中显式使用q"{ case ..$cases } : PartialFunction[Int, Int]"。如果没有显式类型定义,它就无法工作(否则假设PartialFunction[Any, Int])。
这是部分函数的 quasiquote 语法的规范。它作为纯语法树工作,但显然不能解释为类型化表达式,除非PartialFunction[Any, T]通过宏,除非类型明确。