如何让 Scala ToolBox 查看 REPL 定义?

2024-04-23

当反思还处于萌芽阶段时,在 Scala 2.10.0 里程碑的日子里,我问了一个问题 https://stackoverflow.com/q/11055210/53013关于如何使用它来查看 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 上的定义?


最近,当我试图使其支持类型宏时,我深入研究了 repl,因此我有能力解释为什么它不起作用。让它发挥作用将是下一步:)

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

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

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

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

如何让 Scala ToolBox 查看 REPL 定义? 的相关文章

随机推荐