【问题标题】:How can I get Scala ToolBox to see REPL definitions?如何让 Scala ToolBox 查看 REPL 定义?
【发布时间】:2013-02-04 21:04:31
【问题描述】:

当反射仍处于初期阶段时,在 Scala 2.10.0 里程碑的日子里,我 asked a question 关于如何使用它来查看来自 REPL 的代码树 sn-ps。出色的答案比我问的更进一步,并展示了如何使用它们来解析和评估树,所以我继续尝试在我今天正在进行的一个小项目中使用它。

不幸的是,以这种方式解析和评估的代码似乎没有看到任何 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 上的定义?

【问题讨论】:

  • 相对于不在REPL中?我在一个 sbt 项目中编写了完全相同的代码 (gist.github.com/jedesah/5812481),并且得到了与 REPL 中相同的行为。如果这是 ToolBox 在其他情况下的工作方式,我很想知道。
  • @UndercoverAgent 工具箱中的代码可以访问您可以从“root”访问的任何内容——否则它将毫无用处。在您展示的情况下,该变量在“根”中不可用。
  • 无用这个词有点强,它可以用来评估自包含的树。无论如何,您正在/正在从事的这个小项目是开源的吗?我很想看到一个访问外部(从树本身)定义的示例,我不确定从“根”访问它们的确切含义。
  • 好吧,没关系,我明白了! :-)
  • 这不是一个真正的项目。我尝试编写一个用于 REPL 的两行单元测试套件,除了这里的这个小细节之外,它本来可以工作的。

标签: scala reflection scala-2.10


【解决方案1】:

最近我研究了 repl,试图让它支持类型宏,所以我有能力解释为什么它不起作用。下一步将是让它工作:)

我知道您知道输入 repl 的每个 sn-p 在编译之前都会被包装到一些样板文件中。因此,x 最终成为一个名称怪异的包中嵌套嵌套对象中的一个字段。

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

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-03-14
    • 2011-09-08
    • 1970-01-01
    • 2020-04-03
    相关资源
    最近更新 更多