• [^] # Re: Ruby

    Posté par (site web personnel) . En réponse au journal A mort les boucles. Évalué à 2.

    Lisaac*. Tout y est objet, comme en ruby, même le booléen.

    En lisaac, le for est un message de INTEGER

    1.to 10 do { i.print;};

    Il prend en paramètre un BLOCK, c à d, une liste d'instruction, auquel il donne la valeur de i en argument.

    De la même manière, grâce au type block, tu peux faire des map/fold/filter à pas cher.
    Dans COLLECTION :

    - map blc : BLOCK : SELF<- (
    + result : SELF := SELF.create 0;
    lower.to upper do { i : INTEGER;
    result.add (blc.value item i);
    };
    result
    );

    donc ça donnerai

    montab.map { elt : TABLO;
    elt.print;
    };

    Oui faut déclarer un elt, donc c'est plus un foreach en fait.

    Mais tu as ça à la vitesse du C**

    Je me suis amusé à faire joujou avec les listes à la caml, du genre

    let rec toto = function
    [] -> 0 |
    e::[] -> e |
    t::q -> 10+t+toto q;;

    Les fonctions dans COLLECTION :

    - when_empty blc : BLOCK <- (
    blc.value;
    );

    - when_alone blc : BLOCK <- (
    (count = 1).if {
    blc.value first;
    };
    );

    when_list blc : BLOCK <- (
    (count > 1).if {
    blc.value first,(slice (lower+1) to upper);
    };
    );

    Ca permettra de faire :

    + lst : LIST[INTEGER_32].create 5;
    + res : INTEGER_32;
    lst.add 1;
    lst.add 2;
    lst.add 3;
    lst.add 4;
    lst.add 5;

    lst.when_empty {res := 1;};
    .when_alone {
    x : INTEGER_32;
    res := x;
    };
    .when_list {
    x : INTEGER_32;
    y : LIST[INTEGER_32]
    res := 10+x+y.map {x,y : INTEGER_32; x+y};
    };

    * Oui je sais, je l'avais pas encore faite ;-)
    ** http://isaacos.loria.fr/li_benchs.html

    « Il n’y a pas de choix démocratiques contre les Traités européens » - Jean-Claude Junker