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 :

Continuation + Static scope environment


Sujet :

Scheme

  1. #1
    Membre actif
    Avatar de mathk
    Inscrit en
    Décembre 2003
    Messages
    211
    Détails du profil
    Informations forums :
    Inscription : Décembre 2003
    Messages : 211
    Points : 233
    Points
    233
    Par défaut Continuation + Static scope environment
    Bonjour,

    J'essaye d'implementer l'algo d'un producteur avec les continuatuions

    Voila mon code:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    (define producer (local [(define resume (box false))]
                               (lambda (real-send)
                                 (local [(define real-sendb (box real-send))
                                         (define send (lambda (value-to-send)
                                                       (let/cc k
                                                          (begin
                                                            (set-box! resume k)
                                                            ((unbox real-sendb) value-to-send)))))]
                                   (if (unbox resume)
                                       (begin
                                         (set-box! real-sendb real-send)
                                         ((unbox resume) 'dummy))
                                       (begin
                                         (send 'providence)
                                         (send 'houston)
                                         (send 'bangalroe)))))))
    Pour utiliser le producteur voici le code:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     (printf "Get 1 ~a" (let/cc k (route-producer k)))
     (printf "Get 2 ~a" (let/cc k (route-producer k)))
    Mais voila le problem c'est que real-sendb utilse la premiere continuation passe en parametre

    real-sendb est donc toujours egale, et ce malgres mon (set-box! real-sendb real-send) a:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    (lambda (k-value)
    (prinf "Get 1 ~a" value))
    La solution est donc:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    (define route-producer (local [(define resume (box false))]
                               (lambda (real-send)
                                 (local [(define real-sendb (box real-send))
                                         (define send (lambda (value-to-send)
                                                       (set-box! real-sendb (let/cc k
                                                          (begin
                                                            (set-box! resume k)
                                                            ((unbox real-sendb) value-to-send))))))]
                                   (if (unbox resume)
                                         ((unbox resume) real-send)
                                       (begin
                                         (send 'providence)
                                         (send 'houston)
                                         (send 'bangalroe)))))))

    Mais voila je ne comprend pas pourquoi ma premiere solution ne marche pas.

    Merci

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

    Informations forums :
    Inscription : Juillet 2005
    Messages : 1 958
    Points : 2 467
    Points
    2 467
    Par défaut
    Avant de chercher plus loin... j'aimerais te demander :
    0) quel langage utilises-tu ? mzscheme ?
    1) pourquoi utilises-tu local ? est-ce bien celui de "etc.ss" ?
    2) pourquoi utilises-tu box ?
    3) que produit ton producer ?
    4) pourquoi veux tu des continuations dans ton code ?

    Bon je pense comprendre que c'est un problème de devoir, mais j'aimerais être sûr. Sinon c'est très compliqué pour pas grand chose.

  3. #3
    Membre actif
    Avatar de mathk
    Inscrit en
    Décembre 2003
    Messages
    211
    Détails du profil
    Informations forums :
    Inscription : Décembre 2003
    Messages : 211
    Points : 233
    Points
    233
    Par défaut
    A vrai dir je lis le livre
    http://www.cs.brown.edu/~sk/Publicat...gs/2007-04-26/
    Chapitre 19.6

    Et j'utilise donc le language fourni.
    Pretty Big PLAI Scheme

    http://www.cs.brown.edu/~sk/Publicat...s/plai-371.plt

  4. #4
    Membre actif
    Avatar de mathk
    Inscrit en
    Décembre 2003
    Messages
    211
    Détails du profil
    Informations forums :
    Inscription : Décembre 2003
    Messages : 211
    Points : 233
    Points
    233
    Par défaut
    Citation Envoyé par Garulfo Voir le message
    Bon je pense comprendre que c'est un problème de devoir, mais j'aimerais être sûr. Sinon c'est très compliqué pour pas grand chose.
    As-tu une idee en tete?

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

    Informations forums :
    Inscription : Juillet 2005
    Messages : 1 958
    Points : 2 467
    Points
    2 467
    Par défaut
    Citation Envoyé par mathk Voir le message
    As-tu une idee en tete?
    Oui. J'ai même mieux, j'ai la réponse

    Ça demande un peu de travail de compréhension de ma part et — sans vouloir jouer le vantard — cela veut dire que c'est un problème bien compliqué.

    Je vais essayer de t'expliquer, mais ce n'est pas évident. Si tu n'as pas bien saisi profondément les principes de fermeture et de capture des continuations courantes c'est pas du tout aisé.

    En plus, si j'étais devant toi je te ferais un dessin — ce n'est pas une métaphore — mais là, c'est moins facile à décrire.

    Dans ton premier exemple, lorsque le premier send est appelé, i.e. (send 'providence), il lie syntaxiquement une valeur pour real-sendb. Lorsque tu crois modifier real-sendb lors d'un deuxième passage, tu ne modifies pas le bon (celui capturé dans le premier send) mais un autre que tu viens de définir par un nouvel appel à route-producer.
    J'ai réécris un peu ta première fonction pour le mettre en évidence
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    (require (lib "trace.ss"))
    (define route-producer (local [(define resume (box false))]
                             (lambda (real-send n)
                               (local [(define real-sendb (box real-send))
                                       (define compteur n)
                                       (define send (lambda (value-to-send)
                                                      (let/cc k
                                                        (begin
                                                          (printf "compteur : ~a\n" compteur)
                                                          (set-box! resume k)
                                                          ((unbox real-sendb) value-to-send)))))]
                                 (trace send)
                                 (if (unbox resume)
                                     (begin
                                       (set-box! real-sendb real-send)
                                       ((unbox resume) 'dummy))
                                     (begin
                                       (send 'providence)
                                       (send 'houston)
                                       (send 'bangalroe)))))))
    
    
    (printf "Get 1 ~a \n" (let/cc k (route-producer k 0)))
    (printf "Get 2 ~a \n" (let/cc k (route-producer k 1)))
    J'ai mis en bleu ce qui est changé. L'un des avantages de local c'est qu'on peut tracer les fonctions internes. Profitons en donc.
    L'exécution de ça produit l'affichage
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    |(send providence)
    compteur : 0
    Get 1 providence 
    |dummy
    |(send houston)
    compteur : 0
    Get 1 houston
    On voit que c'est deux fois « compteur : 0 » qui apparaît. En effet, dans resume, lors du deuxième appelle de route-producer se trouve la continuation du premier send. Celui ci capture dans sa fermeture les valeurs des premiers real-sendb et compteur.

    Est ce que tu comprends pourquoi ça ne marchait pas ?

    Alors, pourquoi ça fonctionne dans le deuxième ? Car c'est bien toujours le send qui est capturé avec toujours dans sa fermeture le premier real-sendb. Et oui, mais justement. Lors de l'appel de ce « premier » send, la variable real-sendb qui va être modifiée ne va pas être la nouvelle mais l'ancienne. Pour le voir, on peut constater que si on fait les même modification que tantôt à ton deuxième code, compteur ne change toujours pas.
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    (define route-producer2 (local [(define resume (box false))]
                              (lambda (real-send n)
                                (local [(define real-sendb (box real-send))
                                        (define compteur n)
                                        (define send (lambda (value-to-send)
                                                       (set-box! real-sendb (let/cc k
                                                                              (begin
                                                                                (printf "compteur : ~a\n" compteur)
                                                                                (set-box! resume k)
                                                                                ((unbox real-sendb) value-to-send))))))]
                                  (trace send)
                                  (if (unbox resume)
                                      ((unbox resume) real-send)
                                      (begin
                                        (send 'providence)
                                        (send 'houston)
                                        (send 'bangalroe)))))))
    
    
    (printf "Get 1 ~a \n" (let/cc k (route-producer2 k 0)))
    (printf "Get 2 ~a \n" (let/cc k (route-producer2 k 1)))
    ce qui donne
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    |(send providence)
    compteur : 0
    Get 1 providence 
    |#<void>
    |(send houston)
    compteur : 0
    Get 2 houston
    C'est un problème difficile ce que tu demandes ici.
    Mais j'espère t'avoir éclairé.

  6. #6
    Membre actif
    Avatar de mathk
    Inscrit en
    Décembre 2003
    Messages
    211
    Détails du profil
    Informations forums :
    Inscription : Décembre 2003
    Messages : 211
    Points : 233
    Points
    233
    Par défaut
    Citation Envoyé par Garulfo Voir le message

    Est ce que tu comprends pourquoi ça ne marchait pas ?

    Oui merci bcp.
    Permet moi donc dereformuler ce que tu m'as expliquer pour voir si j'ai bien compris.

    Les differents appele a la closure route-produceur capture bien plusieur send et il en est de meme pour real-send et real-sendb.

    En revanche la continuation stocker dans resume continue toujours selon la premiere capture du send etand donner que la fermeture de resume ce passe lors de l'evaluation de route-produceur (cad lorsque (define route-produceur ...) est evalue).

    C'est pourquoi il faut que se soit la premiere capture de real-sendb qui change. Le real-sendb qui est fermer avec se fameux premier send.

    Il me s'emble que j'ai parfaitement compris mais il me semble aussi que je suis tres confus.

    En tous cas merci

    OT: Je suis bien daccord avec Bertrand Russell j'ajouterais meme qu'a la fin on ne sais toujours pas qui a tord ou raison. (Bien sur pour eviter toute interpretation fausse d'un corrolaire)

  7. #7
    Membre actif
    Avatar de mathk
    Inscrit en
    Décembre 2003
    Messages
    211
    Détails du profil
    Informations forums :
    Inscription : Décembre 2003
    Messages : 211
    Points : 233
    Points
    233
    Par défaut
    Citation Envoyé par Garulfo Voir le message
    Sinon c'est très compliqué pour pas grand chose.
    Je pensais que tu avais une idee de solution plus simple pour faire un producteur.

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

    Informations forums :
    Inscription : Juillet 2005
    Messages : 1 958
    Points : 2 467
    Points
    2 467
    Par défaut
    Citation Envoyé par mathk Voir le message
    [...]
    Il me s'emble que j'ai parfaitement compris mais il me semble aussi que je suis tres confus. [...]
    TU me sembles effectivement bien comprendre. Bravo c'est pas simple.

    Citation Envoyé par mathk Voir le message
    [...]
    OT: Je suis bien daccord avec Bertrand Russell j'ajouterais meme qu'a la fin on ne sais toujours pas qui a tord ou raison. (Bien sur pour eviter toute interpretation fausse d'un corrolaire)
    Mais comme tout bon logicien je te dirais que : tous le monde a tord ou raison En tout cas, Russell est mon maître à penser dans les philosophes contemporains.

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

    Informations forums :
    Inscription : Juillet 2005
    Messages : 1 958
    Points : 2 467
    Points
    2 467
    Par défaut
    Citation Envoyé par mathk Voir le message
    Je pensais que tu avais une idee de solution plus simple pour faire un producteur.
    Oui, je n'avais pas compris que tu me demandais si j'avais un idée pour ça.
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    (define (create-producer list-elements) 
      (let* [(elements list-elements)
             (producer-k (lambda (k) (if (pair? list-elements)
                                         (let [(head (car list-elements))
                                               (tail (cdr list-elements))
                                               ]
                                           (set! list-elements tail)
                                           (k head)
                                           )
                                         'error:no-more-elements
                                         )
                           )
                         )
             ]
        producer-k
        )
      )
    
    (define producer-cities (create-producer '(providence houston bangalroe)))
    
    (printf "Get 1 ~a \n" (let/cc k (producer-cities k)))
    (printf "Get 2 ~a \n" (let/cc k (producer-cities k)))
    (printf "Get 3 ~a \n" (let/cc k (producer-cities k)))
    (printf "Get 4 ~a \n" (let/cc k (producer-cities k)))
    La seule différence est le comportement pour les éléments surnuméraires. Mais je suppose que l'exercice prenait place dans un contexte. Cette solution n'est donc pas pertinente aux acquis de l'exercice.

  10. #10
    Membre actif
    Avatar de mathk
    Inscrit en
    Décembre 2003
    Messages
    211
    Détails du profil
    Informations forums :
    Inscription : Décembre 2003
    Messages : 211
    Points : 233
    Points
    233
    Par défaut
    Citation Envoyé par Garulfo Voir le message
    Mais comme tout bon logicien je te dirais que : tous le monde a tord ou raison En tout cas, Russell est mon maître à penser dans les philosophes contemporains.
    Cool je vais l'ajouter dans ma list des auteurs a lire

  11. #11
    Membre actif
    Avatar de mathk
    Inscrit en
    Décembre 2003
    Messages
    211
    Détails du profil
    Informations forums :
    Inscription : Décembre 2003
    Messages : 211
    Points : 233
    Points
    233
    Par défaut
    Citation Envoyé par Garulfo Voir le message
    Oui, je n'avais pas compris que tu me demandais si j'avais un idée pour ça.
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    (define (create-producer list-elements) 
      (let* [(elements list-elements)
             (producer-k (lambda (k) (if (pair? list-elements)
                                         (let [(head (car list-elements))
                                               (tail (cdr list-elements))
                                               ]
                                           (set! list-elements tail)
                                           (k head)
                                           )
                                         'error:no-more-elements
                                         )
                           )
                         )
             ]
        producer-k
        )
      )
    
    (define producer-cities (create-producer '(providence houston bangalroe)))
    
    (printf "Get 1 ~a \n" (let/cc k (producer-cities k)))
    (printf "Get 2 ~a \n" (let/cc k (producer-cities k)))
    (printf "Get 3 ~a \n" (let/cc k (producer-cities k)))
    (printf "Get 4 ~a \n" (let/cc k (producer-cities k)))
    La seule différence est le comportement pour les éléments surnuméraires. Mais je suppose que l'exercice prenait place dans un contexte. Cette solution n'est donc pas pertinente aux acquis de l'exercice.
    Oui c'est effectivement plus simple.
    Les elements surnumeraires sont les elements qui n'appartiennent pas a la liste?

    Autre question est-ce que local et let ont la meme semantique?

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

    Informations forums :
    Inscription : Juillet 2005
    Messages : 1 958
    Points : 2 467
    Points
    2 467
    Par défaut
    Citation Envoyé par mathk Voir le message
    Oui c'est effectivement plus simple.
    Les elements surnumeraires sont les elements qui n'appartiennent pas a la liste?
    Je parlais effectivement des appels qui suivent l'appel ayant travaillé sur le dernier élément.

    Citation Envoyé par mathk Voir le message
    Autre question est-ce que local et let ont la meme semantique?
    Non. local est une macro qui fait une définition au top-level avec un nom unique. Le nom des variables liées par le local dans l'expression de ce dernier sont modifiées en conséquence. Personnellement, je n'y vois que peu d'intérêt en général. Cela permet d'appeler à l'interne des procédures ou des macros qui ne pourrait être appliquées que sur des éléments du top-level. Le seul véritable intérêt c'est pour le trace

  13. #13
    Membre actif
    Avatar de mathk
    Inscrit en
    Décembre 2003
    Messages
    211
    Détails du profil
    Informations forums :
    Inscription : Décembre 2003
    Messages : 211
    Points : 233
    Points
    233
    Par défaut
    Citation Envoyé par Garulfo Voir le message
    Je parlais effectivement des appels qui suivent l'appel ayant travaillé sur le dernier élément.



    Non. local est une macro qui fait une définition au top-level avec un nom unique. Le nom des variables liées par le local dans l'expression de ce dernier sont modifiées en conséquence. Personnellement, je n'y vois que peu d'intérêt en général. Cela permet d'appeler à l'interne des procédures ou des macros qui ne pourrait être appliquées que sur des éléments du top-level. Le seul véritable intérêt c'est pour le trace
    Ok merci bcp

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

Discussions similaires

  1. Introduction à l'Intégration Continue, Présentation de MsTest et de Static
    Par Louis-Guillaume Morand dans le forum EDI/Outils
    Réponses: 1
    Dernier message: 14/04/2009, 08h55
  2. Introduction à l'Intégration Continue, Présentation de MsTest et de Static
    Par Louis-Guillaume Morand dans le forum Intégration Continue
    Réponses: 0
    Dernier message: 21/02/2009, 14h21
  3. [VB6] attendre un événement pour continuer l'exécution
    Par Argonz dans le forum VB 6 et antérieur
    Réponses: 21
    Dernier message: 12/11/2002, 13h08
  4. [langage] Continuer a parser une ligne
    Par D[r]eadLock dans le forum Langage
    Réponses: 5
    Dernier message: 30/09/2002, 18h49
  5. les variables globales static
    Par gRRosminet dans le forum C
    Réponses: 8
    Dernier message: 27/04/2002, 08h34

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