我是scala宏的新手,我花了几天的时间尝试编写我的第一个宏。我对准引号连接有问题。
有一个案例条款的列表,让我们假设如下:
val cases = cq"x => 1 " :: cq"_ => 0 " :: Nil我需要从它构建一个部分函数。问题是,我不知道如何在最后的准引用中粘贴它们。文档中说我应该这样做:
q"{ case ..$cases }"但如果我这么做是行不通的。
有办法从这样的列表构建PartialFunction吗?
谢谢你的帮助。
发布于 2015-05-20 13:49:26
在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]中显式地使用q"{ case ..$cases } : PartialFunction[Int, Int]"。在没有显式类型定义的情况下,它无法工作(否则它假设为PartialFunction[Any, Int])。
这里是部分函数拟引号语法的规范。它作为纯语法树工作,但显然不能被解释为类型化表达式,除非将类型显式化,否则宏只能将PartialFunction[Any, T]解释为类型化表达式。
https://stackoverflow.com/questions/30343289
复制相似问题