2013-02-04 12 views
12

Wstecz, gdy odbicie jeszcze trwało, w dniach, w których pojawiły się kamienie milowe Scala 2.10.0, I asked a question, 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.Jak mogę uzyskać Scala ToolBox, aby zobaczyć definicje REPL?

Niestety, kod analizowany i oceniany w ten sposób wydaje się nie widzieć ż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 zmusić go do uznania definicje dokonane na REPL?

+0

W przeciwieństwie do nie w REPL? Napisałem dokładnie ten sam kod (https://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

+0

@UndercoverAgent Code w przyborniku ma dostęp do wszystkiego, co można uzyskać z "root" - w przeciwnym razie byłby zupełnie bezużyteczny. W przypadku, gdy pokazałeś, ta zmienna nie była dostępna w "root". –

+0

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

Odpowiedz

6

Niedawno wkopałem się w replikę, próbując uczynić obsługę makr typu wsparcia, więc jestem dobrze przygotowany, aby wyjaśnić, dlaczego to nie działa. Uruchomienie go byłoby następnym krokiem :)

Wiem, że wiesz, że każdy fragment wprowadzony do replikacji zostanie zawinięty w jakiś standardowy zestaw, 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ście problemu polegałoby na tym, że w jakiś sposób dojdziemy do obiektu reprezentującego replikę, poprosimy go o zdefiniowane symbole, a następnie wygenerujemy odpowiednie importowanie do kodu, który podajemy 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).

+0

[SI-7081] (https://issues.scala-lang.org/browse/SI-7081) –

Powiązane problemy