Scala 准引用连接

Scala quasiquote concatenation

我是 scala 宏的新手,我花了几天时间尝试编写我的第一个宏。 我对准引号连接有疑问。

有case子句列表,下面说一下:

val cases = cq"x => 1 " :: cq"_ => 0 " :: Nil

我需要从中构建一个部分函数。 问题是我不知道如何将它们粘贴到最终的准引用中。 文档说我应该这样做:

q"{ case ..$cases }"

但是我这样做是行不通的。

有没有办法从这样的列表中构建一个 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)

    }
}

然后您可以调用 Macros.partial(1),例如,或 Macros.partial.isDefinedAt(2)

请注意,为了完成这项工作,我必须在准引用 q"{ case ..$cases } : PartialFunction[Int, Int]" 中明确使用 PartialFunction[Int, Int]。如果没有显式类型定义,它就无法工作(否则假定 PartialFunction[Any, Int])。

Here 是部分函数的准引用语法规范。它作为一个纯语法树工作,但显然不能被解释为一个类型化的表达式,除了 PartialFunction[Any, T] 除非类型是显式的。