Я пытаюсь оценить в Expr
внутри макроса с помощью Context#eval
метода:Как оценить выражение внутри макроса Scala?
//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
}
Было бы полезно, если бы вы могли опубликовать весь код в проекте github. Затем я убеждаюсь, что мы не пропустим ваш случай использования при установке resetAttrs. –