[nem-pl] Re: [nem-feedback] Dzięki , witam ponownie
Kamil Skalski
nazgul at omega.pl
Sun Mar 14 13:05:29 CET 2004
Sunday 14 of March 2004 03:00, Pawel Rozanski wrote:
> Jak mam w definicji funkcji C# "object[]" to się robi
> wesoło np. dziwoląg który działa wygląda tak:
>
> (*)
> array[("ala":>object),("ala":>object),
> (false:>object),(true:>object)]
teoretycznie powinno to wyglądać tak:
def tab = (array["ala", "ala", false, true] : array<object>),
ale ponieważ system typów działa z dołu do góry, to nie łapie o co chodzi i
trzeba napisać tak:
def tab = array[ ("ala" : object), "ala", false, 1 ];
niestety ten przykład psuje się podczas wykoniania - wydaje mi się, że Nemerle
generuje zły kod dla konwersji typów prostych (bool, int) na object
Działa natomiast
def tab = array[ ("ala" : object), "ala", (false :> object), (1 :> object)];
powinno też
def tab = (array (4) : array<object>);
tab[0] <- "ala";
tab[1] <- "ala";
tab[2] <- (false :> object);
...
Kluczowa różnica jest tu między ':' i ':>' - pierwsze jest statycznym
określeniem typu (w górę), a drugie dynamicznym rzutowaniem (w górę lub w
dół).
>
> Lub zrobilem sobie liste Widget-ów...
> (**)
> [Window("bdzio"), Button("ala")]
>
> tu już ładniej ale jak chce potem.. coś z tym zrobić
> to musze np tak (prawda? czy da sie to jakoś ładniej)
>
> static okna <'Widg>(o : list<'Widg>):void
> {
>
> | w :: wt =>
>
> (w:>Widget).Show(); okna(wt)
>
> | _ =>
>
> ()
> }
Nie, wystarczy że popowiesz kompilatorowi, że masz listę Widgetów, a nie
Windowów:
[(Window("bdzio") : Widget), Button("ala")]
Nasza rekonstrukcja typów jest jeszcze trochę głupawa, nie domyśla się że one
mogą mieć wspólny typ Widget. Chociaż nawiasem mówiąc ciekawe co on w tym co
napisałeś wydedukował.
> Pytania:
> Wszystkie elementy z (**) dziedzicza po Widget.. to czemu
> nie moge zrobic poprostu:
> static okna (o : list<Widget>):void ?
Prawdopodobnie kompilator zrekonstruował dla tamtej listy inny typ niż Widget,
dlatego trzeba mu czasami pomóc. A robienie funkcji rzutującej sobie 'a na
Widget nie jest eleganckim rozwiązaniem :)
>
> Jak wyglada makro ktore z ["ala","ala",false,true] zrobi
> mi dziwolaga (*).? Walcze z tym a tu juz 2:50 więc proszę
> w miare możliwości o pomoc...
macro castedarray (arr) {
match (arr) {
| <[ array [.. $elements ] ]> =>
def casted = List.Map (elements, fun (x) { <[ ($x :> object) ]> });
<[ array [.. $casted] ]>
| _ => arr
}
czy jakoś tak...
> Hmm, kod z "5.4. Constructs with variable amount of elements"
> jest ciut zamotany (tam jakies expr definiowane, a potem z tego
> juz nic nie robia...)
Upss, tam powinno być exps, już poprawiłem.
>
> BTW Przejrzałem sobie "stdoperators.n" to mnie rozbroiło...
Ekhem, stdoperators nie jest najlepszym przykładem na makra... To znaczy tam
siedzi kawałek wewnętrznych procedur kompilatora i nie jest w żadnym wypadku
wzorcowym sposobem definiowania operatorów. W ogóle definiowanie operatorów,
to kolejna rzecz, którą musimy przemyśleć - ale raczej pod względem
implementacji ich kompilowania, a nie jak definiować, bo to jest raczej
oczywiste.
More information about the devel-pl
mailing list