如何让Scala ToolBox查看REPL定义?

时间:2013-02-04 21:04:32

标签: scala reflection scala-2.10

当反射仍然开始时,在Scala 2.10.0里程碑的时代,我asked a question关于如何使用它来查看REPL的代码片段树。优秀的答案比我的要求更进一步,并展示了它们如何用于解析和评估树木,所以我继续尝试将它用于我今天进行的一个小项目。

不幸的是,以这种方式解析和评估的代码似乎没有看到任何REPL定义:

scala> val x = 1
x: Int = 1

scala> import scala.tools.reflect.ToolBox
import scala.tools.reflect.ToolBox

scala> val tb = scala.reflect.runtime.universe.runtimeMirror(
  getClass.getClassLoader).mkToolBox()
tb: scala.tools.reflect.ToolBox[reflect.runtime.universe.type] = ...

scala> tb.eval(tb.parse("x"))
scala.tools.reflect.ToolBoxError: reflective compilation has failed:

not found: value x

有没有办法让它识别在REPL上做出的定义?

1 个答案:

答案 0 :(得分:6)

最近我在尝试使其支持类型宏时挖到了repl,所以我很好地解释了为什么它不起作用。让它工作将是下一步:)

我知道您知道进入repl的每个片段在编译之前都会被包装到一些样板中。因此,x最终成为具有奇怪名称的包中嵌套嵌套嵌套对象中的字段。

显然,repl跟踪所有已定义的符号,然后注入必要的导入以及它生成的样板。因此后续行可以看到x不合格。相比之下,工具箱只是重复使用repl的类加载器,但不对导入做任何事情,因此失败。

解决方法是以某种方式获取表示repl的对象,询问有关已定义的符号,然后生成相应的导入到您提供给工具箱的代码中。如果您提交了一张票,我将尝试在2.10.1代码冻结疯狂结束后(假设本周末)编写一个变通方法。