Подтвердить что ты не робот

Как я могу получить Scala ToolBox, чтобы увидеть определения REPL?

Назад, когда отражение было все еще зарождающимся, в дни 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?

4b9b3361

Ответ 1

Недавно я врывался в repl, пытаясь сделать его макросом типа поддержки, поэтому я хорошо подготовлен, чтобы объяснить, почему он не работает. Приступить к работе будет следующим шагом:)

Я знаю, что вы знаете, что каждый фрагмент, введенный в repl, завершается в какой-либо шаблон, прежде чем компилироваться. Следовательно, x становится полем вложенного вложенного вложенного объекта в пакете со странным именем.

По-видимому, repl отслеживает все определенные символы, а затем вводит необходимые импорты вместе с генерируемым шаблоном. Поэтому последующие строки могут видеть, что x неквалифицирован. Для контраста панели инструментов просто повторно используют replocketloader, но ничего не делают с импортом, следовательно, сбой.

Обходным путем было бы как-то добраться до объекта, представляющего реплика, спросить его об определенных символах и затем сгенерировать соответствующий импорт в код, который вы передаете на панель инструментов. Если вы подадите билет, я попытаюсь создать код обходного пути после того, как закончится безумие смены кода 2.10.1 (предположительно, конец этой недели).