您好我正在尝试将数学表达式转换为二进制表达式。 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)}
}
}
}
BinOp
,Var
和Number
类为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)))
}
但是,我收到了匹配错误。我是一种新的模式匹配,这是我的第二次宏观试验。所以,如果你能给我一些教育性的例子,简单的解释就会很棒。