[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