首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >Scala拟引号级联

Scala拟引号级联
EN

Stack Overflow用户
提问于 2015-05-20 07:42:43
回答 1查看 858关注 0票数 10

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

有一个案例条款的列表,让我们假设如下:

代码语言:javascript
复制
val cases = cq"x => 1 " :: cq"_ => 0 " :: Nil

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

代码语言:javascript
复制
q"{ case ..$cases }"

但如果我这么做是行不通的。

有办法从这样的列表构建PartialFunction吗?

谢谢你的帮助。

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2015-05-20 13:49:26

在2.11.2中,以下内容适用于我:

代码语言:javascript
复制
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]解释为类型化表达式。

票数 5
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/30343289

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档