Scala拟量子级联

Scala拟量子级联,scala,scala-macros,scala-quasiquotes,Scala,Scala Macros,Scala Quasiquotes,我是scala宏的新手,我花了几天时间尝试编写我的第一个宏。 我有一个问题的准连接 这里有一个case子句列表,让我们假设如下: val cases = cq"x => 1 " :: cq"_ => 0 " :: Nil 我需要从中构建一个部分函数。 问题是,我不知道如何将它们粘贴到最终的Quasikote中。 文件上说我应该这样做: q"{ case ..$cases }" 但如果我这样做,它就不起作用了 有没有办法从这样的列表中构建PartialFunction 感谢您的帮助

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

这里有一个case子句列表,让我们假设如下:

val cases = cq"x => 1 " :: cq"_ => 0 " :: Nil
我需要从中构建一个部分函数。 问题是,我不知道如何将它们粘贴到最终的Quasikote中。 文件上说我应该这样做:

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)

请注意,为了实现这一点,我必须在quasikote
q“{case..$cases}:PartialFunction[Int,Int]”中显式使用
PartialFunction[Int,Int]
。如果没有显式类型定义,它就无法工作(否则它假定
PartialFunction[Any,Int]


是部分函数的Quasiquete语法规范。它作为一个纯语法树工作,但显然不能被宏解释为类型化表达式,除非类型显式化。

我相信这是正确的方法。你到底有什么错误?而且你的模式有点奇怪
x=>1
匹配任何表达式,如果你引用的是名为
x
的局部值,你应该使用
`x`=>1
,因为错误如下:宏扩展期间异常:java.lang.IllegalArgumentException:scala.collection.immutable.List(case(x@)=>1,case_=>0)不是模式匹配case的有效表示形式。您使用的是Scala 2.10还是2.11?如果我这样写,它会工作:val case1=cq“x=>1”val case2=cq“{case$case1 case$case2}”模式匹配anon funcs可以是Function或PartialFunction,具体取决于预期的类型。您的代码有一个错误:
PartialFunction[Int,Int]{case…}
将创建一个在整个域上定义的PartialFunction。您需要的是
{case…}:PartialFunction[Int,Int]
True。很好的捕获。已修复。