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 我需要从中构建一个部分功能. 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]之外的类型化表达式,除非该类型是显式的. (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |