Scala quasiquote concatenation

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?

谢谢你的帮助.

Ben*_*ich 5

以下内容适用于 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]通过宏,除非类型明确。