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 :

La capture de nom


Sujet :

Scheme

  1. #1
    Membre à l'essai
    Profil pro
    Inscrit en
    Septembre 2008
    Messages
    14
    Détails du profil
    Informations personnelles :
    Âge : 43
    Localisation : France

    Informations forums :
    Inscription : Septembre 2008
    Messages : 14
    Points : 13
    Points
    13
    Par défaut La capture de nom
    Dans un problème vu dans un très court cours de Scheme, on m'a dit qu'il était possible de générer des erreurs en réusissant la capture de nom d'une variable en apellant une fonction

    Comme exemple

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    (define-macro (dolist var liste body)
                 '(letrec ((loop (lambda (tail)
                         (if (pair? tail)
                               (let (( ,var (car tail)))
                                ,body
                               (loop (cdr  tail))))))))
                  (loop ,liste)))
    La variable "loop" ici, si une autre copie d'une autre variable "loop" est apellée dans "var", "liste", et "body" risque de causé un problème de "capture de nom", et donc on a dit que c'était possible d'éviter cela avec gensym, ce que je comprend bien.

    Par contre, je ne sais pas comment générer se problème. Je comprend le concept mais je n'ai jamais fait de scheme alors je ne sais même pas comment on fait un appel a une macro avec une variable qui contient un nom d'une autre variable o_O-
    (dotimes(3 (loop4)) write "hello")) ou qqchose du genre?
    Est-ce que le problème se présente de la même facon dans "var", "liste" et "body"?

    Isa

  2. #2
    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
    C'est normal que je n'ai rien compris à ton problème ?

    En premier lieu, si tu n'as jamais fait de Scheme qu'est-ce qui te prend de chercher à répondre à un problème de macro ? Certes les macros en Scheme sont plus facile à digérer que dans n'importe quel langage, mais il faut quand même connaître un minimum de Scheme !

    Ensuite, voyons ce que je peux t'expliquer. Je comprends que tu parles de macro non hygiénique. Ça ça va. Ainsi l'exemple classique utilisé en classe est le suivant
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    (define-macro (echanger-valeurs valeur-1 valeur-2)
      `(let [(tmp ,valeur-1)]
        (begin
          (set! ,valeur-1 ,valeur-2)
          (set! ,valeur-2 tmp))))
    Ceci n'est pas satisfaisant car si quelqu'un utilise cette macro dans le programme suivant
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    (define tmp 'a)
    (define x 'b)
    (echanger-valeurs tmp x)
    on obtient l'expansion suivante de la macro
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    (let [(tmp tmp)]
      (begin
        (set! tmp x)
        (set! x tmp)))
    ce qui ne marche pas, bien entendu. D'où la nécessité d'emploi d'un générateur de symbole ou, mieux, d'une macro hygiénique.

    Est-ce plus clair ?

  3. #3
    Membre à l'essai
    Profil pro
    Inscrit en
    Septembre 2008
    Messages
    14
    Détails du profil
    Informations personnelles :
    Âge : 43
    Localisation : France

    Informations forums :
    Inscription : Septembre 2008
    Messages : 14
    Points : 13
    Points
    13
    Par défaut
    Parles-moi en de se cours de programmation de fou que j'ai pris a l'université, qui effectivement est rempli de question de se genre dans les examens sans que nous n'ayons jamais fait un minimum de scheme (pareil pour haskell, prolog... )

    Enfin, merci de ta réponse, je crois que ca va etre suffisant

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

Discussions similaires

  1. Capture nom de fichier pour envoi de mail avec PJ
    Par Graineur dans le forum Shell et commandes GNU
    Réponses: 3
    Dernier message: 15/03/2011, 13h45
  2. [RegEx] Capturer liste de noms dans une chaine
    Par Rem693 dans le forum Langage
    Réponses: 1
    Dernier message: 25/10/2009, 08h13
  3. [RegEx] Capturer un nom dans mon url
    Par starr dans le forum Langage
    Réponses: 2
    Dernier message: 28/09/2009, 14h57
  4. Capturer le nom de la fenetre "Mes documents"
    Par OhMonBato dans le forum VB 6 et antérieur
    Réponses: 6
    Dernier message: 19/01/2008, 17h29
  5. Capturer le nom du dossiers dernier niveau?
    Par budhax dans le forum Scripts/Batch
    Réponses: 11
    Dernier message: 05/07/2007, 20h11

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