我試圖用Context#eval
方法來評估宏觀內的Expr
:如何評估Scala宏中的表達式?
[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發現,該問題可能是:
//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)
}
然而,編譯器抱怨使用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
}
如果您可以在github項目中發佈整個代碼,將會有所幫助。然後,我會確保在修復resetAttrs時我們不會錯過您的用例。 –