[nem-pl] Uwagi różne

Michal Moskal malekith at pld-linux.org
Fri Feb 20 11:21:45 CET 2004


On Fri, Feb 20, 2004 at 11:02:12AM +0100, Kamil Skalski wrote:
> > > mamy klasy Produkt, ProduktDuzy, .... i chcemy napisać makro, które doda
> > > do nich metodę DumpToFile zapisującą wartości pól klasy gdzieś tam.
> >
> > U mnie to jest funkcja, a nie makro. To nic, że trochę mniej efektywna.
> 
> Hm, zatem masz funkcję, która w runtime potrafi zlistować pola klasy z ich 
> typami?

Ależ Kamilu, my też możemy mieć. System.Reflection is your friend ;)

> > macro MakeDumperFor (c) : decl {
> >    def l = c.Fields ();
> >    def f = <[ f ]>; // gensym
> >    <[
> >       add_methods_for $c {
> >          // Nie wiem, jak u Was można dodawać metody do klasy po jej
> >          // zdefiniowaniu, jeśli w ogóle można. Jeśli nie można, to
> >          // język jest ograniczony.
> >          def DumpToFile ($f : file) : void {
> >             $(uzywamy l)
> >          }
> >       }
> >    ]>
> > }

Hm, może:

macro MakeDumperFor (c) : decl {
   def l = c.Fields ();
   def f = <[ f ]>; // gensym
   c.AddMember (<[ def DumpToFile (f : file) : void { ... $(l) ... } ]>);
   c.AddField ("foobar", <[ type: bool ]>)
}

W quotowaniu byśmy używali tego co już mamy (zaquotowanej lokalnej
funkcji), która by się potem automagicznie zmieniła na funkcję globalną.

> > Chyba że .NET to wyklucza, wtedy pewnie tak 
> > jak piszesz.
> 
> .Net nie ma tu nic do rzeczy - my go tylko używamy do generacji kodu - system 
> makr nie zmienił by się zasadniczo (może poza dynamicznym ładowaniem 
> binarek makr) gdybyśmy generowali Jave, JVM, ELF.

W System.Reflection.Emit da się dodawać pola do typów tylko dopóki się
ich gdzieś nie odziedziczy etc. U nas dodawaniu pól będzie raczej przed
S.R.E. (na naszych wewnętrznych strukturach danych), niemniej jednak
ograniczenia pewnie będą podobne.

-- 
: Michal Moskal :: http://www.kernel.pl/~malekith :: GCS !tv h e>+++ b++
: When in doubt, use brute force. -- Ken Thompson :: UL++++$ C++ E--- a?




More information about the devel-pl mailing list