假设我有一个lambda函数,并使用reify将其转换为包装在Tree中的Expr。例如:
我可以按照以下方式为特定的x进行评估:
呼叫
导致此异常的原因。
val expr = reify{x: Int => 3*(4+x)}
我可以按照以下方式为特定的x进行评估:
val toolbox = currentMirror.mkToolBox()
val fun = toolbox.eval(expr.tree).asInstanceOf[Int => Int]
println(fun(10))
我的目标是打印整个树,带有每个子表达式的值的注释。如何确定所有子表达式及其值?例如,确定当x为10时,存在一个子表达式
(4+x)
这段代码应该返回14。Traverser类让我能够访问树中的每个节点,但我无法弄清如何在每个节点处计算子树。
例如,对于以下代码:
class TestTraverser extends Traverser {
override def traverse(tree: Tree): Unit = {
val toolbox = currentMirror.mkToolBox()
tree match {
case app @ Apply(fun, args) =>
val f = toolbox.eval(app.fun)
case _ =>
}
super.traverse(tree)
}
}
呼叫
new TestTraverser().traverse(expr.tree)
导致此异常的原因。
scala.tools.reflect.ToolBoxError: reflective compilation has failed:
ambiguous reference to overloaded definition,
both method * in class Int of type (x: Char)Int
and method * in class Int of type (x: Byte)Int
match expected type Any