2010-02-04 14 views
12

Czy ktoś zna stan w pełni funkcjonalnego interfejsu API do refleksji dla Scala?Refleksja API dla Scala

Wiem, że można używać interfejsu API do refleksji języka Java, aby wykonywać proste czynności, ale nie działa to dobrze w przypadku funkcji językowych programu Scala. Znalazłem interesting article opisujący eksperymentalny interfejs API Scala Mirroring, ale o ile wiem, jest to wciąż eksperymentalne. Znalazłem również wzmiankę o ScalaSigParser, ale wydaje się, że jest to dość niski poziom.

To jest bardziej ciekawostka niż cokolwiek innego, ponieważ obecnie gram z Scalą. Pomyślałem, że odpowiedź na to pytanie może być również przydatna dla osób zainteresowanych Scalą.

+0

Czy możesz dokładniej określić, co chcesz zrobić? Możesz używać rutyn w scala.tools.nsc, aby pomóc w myleniu nazw, a niektóre rzeczy po prostu nie odzwierciedlają dobrze - naprawdę potrzebujesz kompilacji, aby ci pomóc, ponieważ nie są one tylko kwestią wywoływania istniejących metod (np. jeśli potrzebujesz nowego zamknięcia). –

+0

Po pierwsze, pomyślałem, że byłoby miło utworzyć wystąpienia klas o nazwanych parametrach, tak, że nie musisz się martwić kolejnością parametrów - może to być niezmienny zamiennik stylu JavaBeans. Pomyślałem także, że byłoby miło móc spojrzeć na strukturę klasy, która odnosi się do funkcji Scala. to znaczy. weź mnie wszystkich lekarzy - znajdź głównego - zadzwoń. Lub odpowiedzieć na pytania takie jak to pole val lub var. A poza tym dobrze byłoby użyć API do refleksji wykonanego w idiomatycznym stylu Scala, zamiast polegać na API Javy. Po prostu pomysły .. –

+0

Nie myślałem o niektórych z bardziej dynamicznych funkcji metaprogramowania, takich jak dodawanie metod w środowisku wykonawczym lub eval oświadczeniach w stylu - po prostu bardziej wzdłuż tego, co API Java Reflections pozwala ci zrobić, ale przystosowane do języka Scala. –

Odpowiedz

6

W „niezmienne zamiennikiem wzór stylu JavaBeans” może być wyrażona nazwanych parametrów i ewentualnie adnotacji @BeanProperty:

import reflect._ 
case class A(@BeanProperty val x: String, @BeanProperty val y : Int) 

A(x = "s", y = 3) 
A(y = 3, x = "s") 

metod Dodawanie (bardziej precyzyjne: Definiowanie nowego interfejsu) ma sens tylko w statycznie wpisany język, jeśli klient zna nowe metody i może skompilować się z interfejsem. Przy pisaniu strukturalnym klienci mogą definiować metody, których oczekują od obiektu. Kompilator Scala przekształci typ strukturalny w kod odbicia, który może zawieść w czasie wykonywania.

type T = {def go(x : Int): Int } 
def y(any : Any) = any.asInstanceOf[T].go(2) 

class A{ 
    def go(x : Int) = x + 1 
} 
y(new A()) 
y(new {}) //this will fail 

Możesz zdefiniować nowe klasy lub cechy za pomocą interpreter w locie. Metoda Interpretuje przekształca kod Scala na kod bajtowy.

Wspomniałeś już o ScalaSigParser, z którym nie jest łatwo pracować.

Myślę, że pozostałe funkcje, które lubisz, jeszcze nie istnieją.

+0

Ten błąd kończy się niepowodzeniem w czasie wykonywania z powodu rzutowania, a nie z powodu typów strukturalnych. –