gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-12-01 12:44:31 25 4
gpt4 key购买 nike

我正在尝试使用 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/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com