我怎样才能得到斯卡拉工具箱看到REPL定义?(How can I get Scala ToolBox

2019-08-16 18:14发布

回来时,反射还在初期,斯卡拉上2.10.0里程碑的日子里,我问了一个问题 ,我怎么可以用它来查看从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作出定义?

Answer 1:

最近,我挖成REPL,试图使其支持类型宏时,所以我装备精良,以解释为什么它不工作。 它往返于工作将是下一步:)

我知道,你知道,进入REPL每一个片段被在编译之前裹成一些样板。 因此使得x最终被与怪异名称的包在嵌套嵌套嵌套对象的字段。

显然,REPL跟踪所有定义的符号,然后注入必要的进口与它生成的样板一起。 因此随后的行可以看到,X不合格。 为了对比,工具箱简单地重用REPL的类加载器,但不这样做对进口,因此造成任何影响。

一个解决办法是在某种程度上得到代表REPL对象,要求其对定义的符号,然后产生相应的进口,你喂到工具箱中的代码。 如果您提交了票,我会尽力的2.10.1代码冻结疯狂结束后编写了一个解决办法(据说,这一周结束)。



文章来源: How can I get Scala ToolBox to see REPL definitions?