簡體   English   中英

如何讓Scala ToolBox查看REPL定義?

[英]How can I get Scala ToolBox to see REPL definitions?

當反射仍然開始時,在Scala 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上的定義?

最近我在嘗試使其支持類型宏時挖到了repl,所以我很好地解釋了為什么它不起作用。 讓它工作將是下一步:)

我知道您知道進入repl的每個片段在編譯之前都會被包裝到一些樣板中。 因此,x最終成為具有奇怪名稱的包中嵌套嵌套嵌套對象中的字段。

顯然,repl會跟蹤所有已定義的符號,然后注入必要的導入以及它生成的樣板。 因此后續行可以看到x不合格。 相比之下,工具箱只是重復使用repl的類加載器,但不對導入做任何事情,因此失敗。

解決方法是以某種方式獲取表示repl的對象,詢問有關已定義的符號,然后生成相應的導入到您提供給工具箱的代碼中。 如果你提交了一張票,我將嘗試在2.10.1代碼凍結瘋狂結束后(假設本周末)編寫一個變通方法。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM