Pytanie Jak mogę uzyskać Scala ToolBox, aby zobaczyć definicje REPL?


Wracając, gdy refleks wciąż się rozwijał, w dniach, w których pojawiły się kamienie milowe Scala 2.10.0, I zadał pytanie o tym, jak mogę go użyć, aby zobaczyć drzewa fragmentów kodu z REPL. Doskonała odpowiedź poszła dalej, niż się spytałem i pokazała, w jaki sposób można je wykorzystać do analizowania i oceniania drzew, więc poszedłem do przodu i starałem się użyć tego na małym projekcie, który miałem dzisiaj.

Niestety, kod analizowany i analizowany w ten sposób nie zawiera żadnej definicji 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

Czy istnieje sposób, aby rozpoznać definicje REPL?


12
2018-02-04 21:04


pochodzenie


W przeciwieństwie do nie w REPL? Napisałem dokładnie ten sam kod (gist.github.com/jedesah/5812481) w projekcie sbt i otrzymuję takie samo zachowanie jak w REPL. Jeśli tak działa ToolBox w innym kontekście, byłbym bardzo ciekawy. - jedesah
@UndercoverAgent Code w przyborniku ma dostęp do wszystkiego, do czego możesz dotrzeć z "root" - w przeciwnym wypadku byłby zupełnie bezużyteczny. W przypadku, gdy pokazałeś, ta zmienna nie była dostępna w "root". - Daniel C. Sobral
Bezużyteczne jest trochę mocnym słowem, może być użyte do oceny drzew zawartych. W każdym razie, ten mały projekt, nad którym pracujesz, czy to jest open source? Chciałbym zobaczyć przykład dostępu do zewnętrznych (z samego drzewa) definicji, nie jestem pewien, co masz na myśli mówiąc, dotrzeć do nich z "root". - jedesah
Okay, nieważne, rozumiem! :-) - jedesah
To naprawdę nie jest projekt. Próbowałem napisać zestaw testów jednostkowych z dwiema liniami do użycia z REPL, który działałby, gdyby nie ten mały detal tutaj. - Daniel C. Sobral


Odpowiedzi:


Ostatnio zagłębiłem się w repl, gdy próbuję tworzyć makra typu support, więc jestem dobrze przygotowany, aby wyjaśnić, dlaczego to nie działa. Uruchomienie go będzie kolejnym krokiem :)

Wiem, że wiesz, że każdy fragment wprowadzony do replika zostanie zawinięty do jakiegoś szablonu, zanim zostanie skompilowany. Dlatego, że x kończy się być polem w obiekcie zagnieżdżonych-zagnieżdżonych w pakiecie o dziwnej nazwie.

Najwyraźniej replik śledzi wszystkie zdefiniowane symbole, a następnie wstrzykuje niezbędny import wraz z generowanym przez niego szablonem. Dlatego kolejne linie mogą zobaczyć, że x nie ma kwalifikacji. W przeciwieństwie do tego, przyborniki po prostu ponownie wykorzystują moduł ładujący klasy, ale nie robią nic z importu, stąd błąd.

Obejściem byłoby jakoś dostać się do obiektu reprezentującego replikę, poprosić go o zdefiniowane symbole, a następnie wygenerować odpowiednie importowanie do kodu, który podajesz do przybornika. Jeśli złożysz zgłoszenie, spróbuję zakodować obejście po zakończeniu szaleńczego kodowania 2.10.1 (prawdopodobnie pod koniec tego tygodnia).


6
2018-02-05 08:35



SI-7081 - Daniel C. Sobral