• [^] # Re: un environnement

    Posté par (Mastodon) . En réponse au journal Lisp: pourquoi est-ce different ?. Évalué à 4.

    «Est ce que je dis une betise si je compare ca aux templates du C++ ?»

    Je connais très mal le C++, mais si je ne me trompe pas c'est associable aux functors que l'on trouve dans la STL (ou aux agents dans eiffel, ou à des pointeurs de fonction en C, ou aux blocs en ruby).

    Les templates servent surtout à abstraire les types de données, alors que là c'est le code qu'on abstrait, comme lorsque l'on définit un callback en C. La différence par rapport au C est dans la facilité de combiner les fonctions pour en former de nouvelles. Ça se fait au vol en lisp alors qu'en C il faudrait définir la fonction explicitement.

    «le coup de la fonction map me plait bien aussi»

    On trouve ce genre de fonctions aussi dans la plupart des langages, dont C++ ou Ruby, donc au pire si tu n'es pas convaincu par le fonctionnel il te reste un espoir ;) Et comme je suis fan de ruby, je ne peux pas m'emêcher:

    [1, 3, 12].map { |i| i*2 }
    => [2, 6, 24]

    [1, 3, 12, 4].find { |i| i > 2 and i < 6 }
    => 3

    > [1, 3, 12, 4].find_all { |i| i > 2 and i < 6 }
    => [3, 4]

    [1, 3, 12, 4].collect { |i| i > 2 and i < 6 }
    => [false, true, false, true]

    Ruby est un langage objet, mais ses blocs viennent directement de la programmation fonctionnelle: ici la méthode map appelle le bloc pour chaque élément, et le |i| nomme "i" le premier paramètre de la fonction. Les fonctions à deux paramètres donnent:

    [ 1, 3, 12, 4 ].sort { |a, b|
    b <=> a
    }
    => [12, 4, 3, 1]