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]
除非类型是显式的。
我是 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]
除非类型是显式的。