我正在尝试使用 Context#eval
方法计算宏中的 Expr
:
//Dummy implementation
def evalArrayTree(c: Context)(a: c.Expr[ArrayTree]): c.Expr[Array[Double]] = {
import c.universe._
println( c.eval(a) )
val tree = reify( Array(0.0,0.0,0.0) ).tree
c.Expr[Array[Double]]( tree )
}
但是,编译器会提示:
[error] /home/falcone/prg/sbt-example-paradise/core/src/main/scala/Test.scala:20: exception during macro expansion:
[error] scala.tools.reflect.ToolBoxError: reflective toolbox has failed
如果在 scala-user ML 中找到,可以使用 resetAllAttrs
解决问题。然而
- 我不明白我应该如何使用它。
- 这个函数seems to be deprecated .
那么有办法解决我的问题吗?
其余代码:
object ArrayEval {
import scala.language.experimental.macros
def eval( a: ArrayOps.ArrayTree ): Array[Double] = macro Macros.evalArrayTree
}
object ArrayOps {
sealed trait ArrayTree {
def +( that: ArrayTree ) = Plus( this, that )
}
implicit class Ary( val ary: Array[Double] ) extends ArrayTree
case class Plus( left: ArrayTree, right: ArrayTree ) extends ArrayTree
}
最佳答案
c.eval
的文档确实告诉我们要使用 c.resetAllAttrs
,但是这个函数有一些已知的问题,有时会导致它无法修复地损坏树进程(这就是我们计划在 Scala 2.11 中删除它的原因——我刚刚提交了一个这样做的拉取请求:https://github.com/scala/scala/pull/3485)。
您可以尝试使用 c.resetLocalAttrs
,它具有较小的树损坏可能性。不幸的是它还是有点破。我们计划修复它 ( https://groups.google.com/forum/#!topic/scala-internals/TtCTPlj_qcQ ),但是在 Scala 2.10.x 和 2.11.0 中,将无法使 c.eval
可靠地工作。
关于scala - 如何评估 Scala 宏中的表达式?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/21580206/