[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