• [^] # Re: Python et formes fonctionnelles (reloaded)

    Posté par . En réponse au message de la puissance de (beep) pour trouver un truc simple en 2 minutes. Évalué à 2.

    Ben euh je pense que c'est long et verbeux :)

    Arrête, tu es de mauvaise foi, on repart pas sur des bonnes bases là...

    Long ? Tu compares quoi avec quoi ?
    Tu n'as écrit qu'une procédure ; j'ai écrit un programme complet !!
    Ecrire l'équivalent en perl serait *aussi* long !!

    tu me montres que tu ne peux pas faire de closure en python

    Non, je te montre que *rien* ne justifie que tu parles d' énorme problème de Python, qui t'empêche d'écrire du code fonctionnel. Tu peux me dire à la limite que python te donne des boutons, que tu le supportes pas, mais dans la pratique, je t'ai demandé des cas concrets, où tu te sentirais "bloqué", pour te montrer le code équivalent en python pour répondre au besoin.

    Reprenons:

    1. tu as commencé par affirmer que, quand tu veux écrire en perl,

    @nouvelle_liste = map { $somme += $_; 2*$_ } @liste

    en python selon toi on doit définir une fonction, ou bien utiliser un for... in.... Au départ de l'action c'était ça ton problème super bloquant.

    J'y ai répondu par le code équivalent en python:

    nouvelle_liste = map(lambda x:2*x,liste)
    somme = sum(nouvelle_liste)

    2. tu as ensuite affirmé (sans convenir que ta situation concrète n°1 n'était plus bloquante du coup) que le problème c'est le fait que le lambda n'est pas capable de capturer l'environnement (l'extérieur)

    Je t'ai montré que c'était faux:

    map(lambda fonctionAnonyme:x,g=objetGlobalQuelconque : <corps de la fonction anonyme>, liste)

    3. tu t'es ensuite arquebouté sur le manque de fermeture des formes fonctionnelles en python, que c'en était tellement bloquant que rien que d'y penser tu te sentais mal.

    De deux choses l'une:
    - soit tu en fais une question de principe ("je refuse de coder quoi que ce soit dans un langage qui n'offre pas de formes fonctionnelle avec fermeture") mais bizarrement tu as l'air de coder en java dans ta journée sans que ça te pose problème...
    - soit c'est effectivement indispensablissime, et tu as des cas concrets de code en perl mettant en oeuvre une telle fonctionnalité, et dont l'équivalent en python te semble irréalisable

    Nous en sommes donc là, sachant que dans de tels cas hypothétiques, où je bloquerais sur un équivalent en python, nous avons déjà convenu tous les deux dans l'intervalle qu'on pouvait toujours simuler la fermeture en python, et de façon plutôt plutôt élégante, cf ma deuxième proposition d'un tel code.

    Tu m'as proposé une routine perl, et j'ai mis en oeuvre son équivalent en python dans un programme complet pour que tu puisses le tester : tu as le beurre, l'argent du beurre et la crémière, petit veinard...

    En attendant, j'attends toujours le code perl qui montre le côté "bloquant" de la chose, ou bien cette discussion est close.

    et que tu es donc obligé de définir une méthode pour ton callback, alors que le code très court se prêtait particulièrment bien à être défini par une fonction anonyme...

    ??? Je ne définis rien du tout, et j'ai bien associé mon callback à une fonction anonyme. Le code incriminé est

    dialog.rButton.connect('clicked',
    lambda x,d=dialog: setattr(d,'result',2) & d.quit())


    J'ai souligné le lambda, il était peut-être pas assez visible ?

    On pourrait d'ailleurs au passage noter la verbosité de devoir écrire "self."

    Mais oui, bien sûr !
    Écris-moi donc l'équivalent de ce programme en perl, afin qu'on puisse noter la verbosité de devoir écrire ,ドル@,%,->,& à tout bout de champ...
    Sérieusement, s'il te reste plus que ça comme argument...