IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

Scheme Discussion :

Question à propos de l'implémentation de fermetures dans un langage dynamique


Sujet :

Scheme

  1. #1
    Rédacteur


    Profil pro
    Inscrit en
    Janvier 2003
    Messages
    7 171
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Janvier 2003
    Messages : 7 171
    Points : 15 060
    Points
    15 060
    Billets dans le blog
    1
    Par défaut Question à propos de l'implémentation de fermetures dans un langage dynamique
    Bonjour,
    je ne suis pas certain de poster dans le bon forum mais vu ma question je commence ici.

    J'aimerais savoir si l'implémentation de closure dans un langage dynamique (PowerShell) fonctionne à l'identique des langages tels que le C, C#...
    Enfin plus particuliérement "la capture de l'environnement lexical" est-elle différente ? C'est à dire est-ce qu'on doit capturer les variables de la portée courante ou toutes les variables accessible dans la portée ou bien seulement celles utilisées dans la closure et celles du code l'englobant?

    L'objectif étant de simuler le principe des closures. J'ai aujourd'hui un script qui permet de réaliser une closure mais son inconvénient est qu'il capture de nombreuses variables qui me semblent superflues, notamment les variables globales:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    function NewDecorator
    {
        param ([string]$decoration)
        return closure {
            param ([string]$text)
            return $decoration + $text + $decoration;
        };
    }
    $sharpDecorator = NewDecorator '#';
    $sharpDecorator
    &$sharpDecorator "hoge"; # renvoie #hoge#
    J'ai trouvé une possibilité de réduire le nombre de variables capturées mais j'ai un doute sur la pertinence de ma démarche par rapport au script d'origine.

  2. #2
    Rédacteur
    Avatar de pseudocode
    Homme Profil pro
    Architecte système
    Inscrit en
    Décembre 2006
    Messages
    10 062
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 51
    Localisation : France, Hérault (Languedoc Roussillon)

    Informations professionnelles :
    Activité : Architecte système
    Secteur : Industrie

    Informations forums :
    Inscription : Décembre 2006
    Messages : 10 062
    Points : 16 081
    Points
    16 081
    Par défaut
    je vote pour "seulement celles utilisées dans la closure et celles du code l'englobant".
    ALGORITHME (n.m.): Méthode complexe de résolution d'un problème simple.

  3. #3
    Alp
    Alp est déconnecté
    Expert éminent sénior

    Avatar de Alp
    Homme Profil pro
    Inscrit en
    Juin 2005
    Messages
    8 575
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 35
    Localisation : France, Bouches du Rhône (Provence Alpes Côte d'Azur)

    Informations forums :
    Inscription : Juin 2005
    Messages : 8 575
    Points : 11 860
    Points
    11 860
    Par défaut
    Citation Envoyé par pseudocode Voir le message
    je vote pour "seulement celles utilisées dans la closure et celles du code l'englobant".
    Je dirais pareil que pseudocode.
    Car la closure peut comme dans ton exemple utiliser des variables du code qui l'englobe... mais ça ne servirait à rien du tout de capter des variables du code qui est totalement à l'extérieur.

  4. #4
    Membre émérite
    Avatar de SpiceGuid
    Homme Profil pro
    Inscrit en
    Juin 2007
    Messages
    1 704
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Loire (Rhône Alpes)

    Informations forums :
    Inscription : Juin 2007
    Messages : 1 704
    Points : 2 990
    Points
    2 990
    Par défaut
    Il existe des propositions de langage qui répondent à ta question d'une manière assez satisfaisante:
    http://citeseerx.ist.psu.edu/viewdoc...10.1.1.47.1578

    Autrement, avec une implémentation naïve, tu es obligé de faire un compromis entre expressivité et encapsulation.
    Du même auteur: mon projet, le dernier article publié, le blog dvp et le jeu vidéo.
    Avant de poser une question je lis les règles du forum.

  5. #5
    Rédacteur


    Profil pro
    Inscrit en
    Janvier 2003
    Messages
    7 171
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Janvier 2003
    Messages : 7 171
    Points : 15 060
    Points
    15 060
    Billets dans le blog
    1
    Par défaut
    Merci pour vos réponses.
    Citation Envoyé par SpiceGuid Voir le message
    Il existe des propositions de langage qui répondent à ta question d'une manière assez satisfaisante:
    http://citeseerx.ist.psu.edu/viewdoc...10.1.1.47.1578
    Merci, il me reste à trouver le bon document en espérant qu'il me soit accessible.

  6. #6
    Inactif  
    Profil pro
    Inscrit en
    Juillet 2005
    Messages
    1 958
    Détails du profil
    Informations personnelles :
    Âge : 58
    Localisation : France

    Informations forums :
    Inscription : Juillet 2005
    Messages : 1 958
    Points : 2 467
    Points
    2 467
    Par défaut
    Pourquoi avoir fait atterir ce sujet en Scheme ?
    Le but n'est pas de faire une implémentation en Scheme si ?

    Ou alors j'ai rien compris au sujet

  7. #7
    Rédacteur


    Profil pro
    Inscrit en
    Janvier 2003
    Messages
    7 171
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Janvier 2003
    Messages : 7 171
    Points : 15 060
    Points
    15 060
    Billets dans le blog
    1
    Par défaut
    Citation Envoyé par Garulfo
    Pourquoi avoir fait atterir ce sujet en Scheme ?
    A l'origine j'ai posté dans Algo.

    Citation Envoyé par Garulfo
    Le but n'est pas de faire une implémentation en Scheme si ?
    Non mais on a jugé que le forum Scheme était peut être plus approprié, car c'est un langage dynamique si je ne me trompe, comme PowerShell qui est un shell basé objet et dynamique. C'est peut être le seul lien.

    Il est parfois des cas où on ne sait pas trop quel forum choisir pour poster le sujet

    Ce genre de post devient donc itinérant malgré lui.
    Ah la bohême

  8. #8
    Membre émérite
    Avatar de SpiceGuid
    Homme Profil pro
    Inscrit en
    Juin 2007
    Messages
    1 704
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Loire (Rhône Alpes)

    Informations forums :
    Inscription : Juin 2007
    Messages : 1 704
    Points : 2 990
    Points
    2 990
    Par défaut
    Je dois bien avouer n'avoir rien compris à ta question à la 1ière lecture

    J'aimerais savoir si l'implémentation de closure dans un langage dynamique (PowerShell) fonctionne à l'identique des langages tels que le C, C#...
    Enfin plus particuliérement "la capture de l'environnement lexical" est-elle différente ? C'est à dire est-ce qu'on doit capturer les variables de la portée courante ou toutes les variables accessible dans la portée ou bien seulement celles utilisées dans la closure et celles du code l'englobant?
    Statiquement: tu peux définir des lambda-fonctions (ou fonctions anonymes), à la volée.
    Dynamiquement: en appliquant un argument (ou plus) à une fonction anonyme tu obtiens une fermeture (ou closure).
    Cette fermeture n'est qu'un objet dont les champs sont les arguments réels de l'application de fonction.
    La fermeture est à une lambda ce que l'objet est à sa classe.

    La portée lexicale d'une variable est la même dans un langage dynamique que dans un langage statique.
    La relation qui lie une lambda à sa fonction englobante est transitive (la fonction englobante est éventuellement une lambda).
    Par conséquent tu dois remonter la chaîne des imbrications de fonctions, et toute variable ou paramètre local qui apparaît dans le code de ta fonction anonyme est un champ pour la fermeture crée par cette fonction.
    La durée de vie de la fermeture crée peut éventuellement exéder celle de son code englobant (et d'ailleurs, dans le cas contraire, il n'y a tout simplement pas besoin de créer de fermeture, tout se passe localement, dans la fenêtre de pile), c'est-à-dire que ta fermeture conserve tout son sens même au-delà de la durée de vie des variables de sa fonction englobante.
    Et ça n'est possible que si, lors de la création de cette fermeture, tu as fait une copie de tout l'environnement parent utilisé par ta lambda.

    il capture de nombreuses variables qui me semblent superflues, notamment les variables globales
    Concrètement il suffit de conserver un pointeur sur l'environnement "global", pas besoin de copier l'environnement global dans (toutes!) les fermetures.
    Edit:
    Sauf, bien sûr, si tu peux par exemple échanger des fermetures entre plusieurs processus, dans ce cas la durée de vie d'une fermeture pourrait excéder celle de tes variables globale.
    Du même auteur: mon projet, le dernier article publié, le blog dvp et le jeu vidéo.
    Avant de poser une question je lis les règles du forum.

  9. #9
    Rédacteur


    Profil pro
    Inscrit en
    Janvier 2003
    Messages
    7 171
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Janvier 2003
    Messages : 7 171
    Points : 15 060
    Points
    15 060
    Billets dans le blog
    1
    Par défaut
    Citation Envoyé par SpiceGuid
    La portée lexicale d'une variable est la même dans un langage dynamique que dans un langage statique.
    Ok, cela répond à ma question.
    Citation Envoyé par SpiceGuid
    Par conséquent tu dois remonter la chaîne des imbrications de fonctions, et toute variable ou paramètre local qui apparaît dans le code de ta fonction anonyme est un champ pour la fermeture crée par cette fonction.
    Sous powerShell il est possible de récupérer les variables des portées parente, jusqu'a 100 niveau je crois. Je procéde ainsi :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
         #Recherche des variables de la portée parente
         #Au sein du code parent le contenu des portées "local" et "private" sont identiques en PS v1.0, sauf erreur de ma part.
         #On ne récupére que les variables, automatiques ou non, dont la portée est "none"
    $private:ParentPrivateVariables=Get-Variable -scope 1|? {$_.options -notmatch "AllScope"}
     
     #Ensuite on filtre les variable automatique créées par PowerShell
     ...
    Citation Envoyé par SpiceGuid
    La durée de vie de la fermeture crée peut éventuellement exéder celle de son code englobant
    Effectivement je l'ai testé et cela fonctionne.
    Citation Envoyé par SpiceGuid
    Concrètement il suffit de conserver un pointeur sur l'environnement "global", pas besoin de copier l'environnement global dans (toutes!) les fermetures.
    Sous PowerSehll une directive de portée permet cela :
    Citation Envoyé par SpiceGuid
    Sauf, bien sûr, si tu peux par exemple échanger des fermetures entre plusieurs processus,
    PowerShell v1 ne gére pas très bien les processus et ce n'est pas vraiment un langage de programmation mais du scripting.
    Et il ne faut pas être trop gourmand non plus.

    Encore merci pour tes explications

    Le code d'origine : http://csharper.blog57.fc2.com/blog-entry-218.html
    Les commentaires sont en japonais...

  10. #10
    Inactif  
    Profil pro
    Inscrit en
    Juillet 2005
    Messages
    1 958
    Détails du profil
    Informations personnelles :
    Âge : 58
    Localisation : France

    Informations forums :
    Inscription : Juillet 2005
    Messages : 1 958
    Points : 2 467
    Points
    2 467
    Par défaut
    Je vois toujours pas le rapport direct avec Scheme.
    Le forum langage m'aurait paru mieux...

    Menfinbon

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. [PHP 5.3] Question à propos de l'opérateur "OR" (comme dans "or die")
    Par bastountan dans le forum Langage
    Réponses: 15
    Dernier message: 31/03/2011, 13h38
  2. [WS 2008] Question à propos la création d'un sous domaine dans server 2008
    Par L'aigle de Carthage dans le forum Windows Serveur
    Réponses: 0
    Dernier message: 26/11/2010, 20h57
  3. Réponses: 2
    Dernier message: 18/04/2010, 18h34
  4. Implémentation d'OCL dans les langages de programmation
    Par Tristan Zwingelstein dans le forum UML
    Réponses: 8
    Dernier message: 18/01/2010, 21h02
  5. Question à propos des délégués dans wcf
    Par teddyalbina dans le forum Windows Communication Foundation
    Réponses: 9
    Dernier message: 03/02/2009, 14h01

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo