加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 综合聚焦 > 服务器 > 安全 > 正文

Scala quasiquote concatenation

发布时间:2020-12-16 19:14:55 所属栏目:安全 来源:网络整理
导读:我是 scala宏的新手,我花了几天时间试着写第一篇. 我有quasiquotes连接问题. 有一个案例条款列表,让我们说如下: val cases = cq"x = 1 " :: cq"_ = 0 " :: Nil 我需要从中构建一个部分功能. 问题是我不知道如何将它们粘贴到最终的quasiquote中. 文档说我应
我是 scala宏的新手,我花了几天时间试着写第一篇.
我有quasiquotes连接问题.

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

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

我需要从中构建一个部分功能.
问题是我不知道如何将它们粘贴到最终的quasiquote中.
文档说我应该做这样的事情:

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).

请注意,为了使这项工作,我必须在quasiquote q“{case .. $cases}:PartialFunction [Int,Int]”中明确使用PartialFunction [Int,Int].没有显式类型定义它不起作用(否则假定为PartialFunction [Any,Int]).

Here是部分函数的quasiquote语法规范.它作为一个纯语法树工作,但显然不能被宏解释为除PartialFunction [Any,T]之外的类型化表达式,除非该类型是显式的.

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读