Domanda Come posso ottenere Scala ToolBox per vedere le definizioni REPL?


Quando la riflessione era ancora incipiente, nei giorni di Scala 2.10.0 pietre miliari, I ha fatto una domanda su come potrei usarlo per vedere gli alberi degli snippet di codice da REPL. L'eccellente risposta è andata oltre quello che ho chiesto, e ho mostrato come possono essere utilizzati per analizzare e valutare gli alberi, quindi sono andato avanti e ho cercato di usarlo in un piccolo progetto che avevo fatto oggi.

Sfortunatamente, il codice analizzato e valutato in questo modo non sembra vedere alcuna definizione 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

C'è un modo per farlo riconoscere le definizioni fatte su REPL?


12
2018-02-04 21:04


origine


risposte:


Recentemente ho scavato in repl, quando provavo a farlo supportare macro di tipo, quindi sono ben attrezzato per spiegare perché non funziona. Farlo funzionare sarebbe il prossimo passo :)

So che tu sai che ogni frammento inserito in repl viene inserito in una piastra prima di essere compilato. Di conseguenza, x finisce per essere un campo in un oggetto nidificato nidificato in un pacchetto con un nome strano.

Apparentemente, repl tiene traccia di tutti i simboli definiti e quindi inietta le importazioni necessarie insieme al boilerplate che genera. Pertanto le righe successive possono vedere che x non qualificato. Al contrario, le toolbox semplicemente riutilizzano il classloader di repl, ma non fanno nulla per le importazioni, quindi l'errore.

Una soluzione alternativa sarebbe in qualche modo ottenere un oggetto che rappresenta un repl, chiedergli dei simboli definiti e quindi generare le importazioni corrispondenti nel codice che si alimenta in un toolbox. Se si archivia un ticket, proverò a codificare una soluzione alternativa dopo la fine del follia del codice 2.10.1 (presumibilmente, alla fine di questa settimana).


6
2018-02-05 08:35