scala - 如何评估 Scala 宏中的表达式?

标签 scala macros scala-macros scala-macro-paradise

我正在尝试使用 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 解决问题。然而

  1. 我不明白我应该如何使用它。
  2. 这个函数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/

相关文章:

macros - 订购宏参数执行

c++ - 无需替换 C++ 的预处理器宏

scala - 如何使用 scala 宏来替换方法调用

scala - 使用 Scala 宏将符号拼接在一起

scala - java.lang.NoClassDefFoundError : com/twitter/jsr166e/LongAdder

scala - Spark Scala : value add is not a member of scala. collection.mutable.ListBuffer

macros - nom 如何在宏指示符位置进行宏调用?

Scala 类型约束来检查参数值

java - 是否有任何库可以从 .class 文件(字节码)中提取类、方法、成员和字段依赖项名称?

parsing - scala 的解析器组合器可以解析二进制文件吗?