宏扩展期间Scala匹配错误

时间:2016-11-21 13:53:19

标签: scala macros pattern-matching

您好我正在尝试将数学表达式转换为二进制表达式。 e.g;

2 + x turns into BinOp("+",Number(2.0),Var(x))

我想在编译期间制作这些,所以我在scala中使用了宏。这是我的宏实现;

class ExpressionImplicitsImpl(val c: Context)  {


  def expr(exprTree: c.Expr[AnyRef]) : c.Expr[Expression] = {
    import c.universe._

    exprTree.tree match {
      case Ident(TermName(x)) => reify{Var(x.toString)}
      case Literal(Constant(a)) => reify{Number(a.asInstanceOf[Double])}
      case q"$a + $b" => reify{BinOp("+", expr(a.asInstanceOf).splice, expr(b.asInstanceOf).splice)}
      case q"$a * $b" => reify{BinOp("*", expr(a.asInstanceOf).splice, expr(b.asInstanceOf).splice)}
    }
  }
}

BinOpVarNumber类为case classes并扩展Expression类。但在这种情况下,这并不是那么重要。

我使用此宏的实际类是

 def main(args: Array[String]) {

    import ExpressionImplicits._
    val e1 = expr { (x: Double) => (x * 6) + (8.0 * x) }
    println(e1) // I expect BinOp(+,BinOp(*,Var(x),Number(6.0)),BinOp(*,Number(8.0),Var(x)))
}

但是,我收到了匹配错误。我是一种新的模式匹配,这是我的第二次宏观试验。所以,如果你能给我一些教育性的例子,简单的解释就会很棒。

0 个答案:

没有答案