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

Lisp Discussion :

get-call et get-global


Sujet :

Lisp

  1. #1
    Membre à l'essai
    Profil pro
    Inscrit en
    Avril 2013
    Messages
    21
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2013
    Messages : 21
    Points : 16
    Points
    16
    Par défaut get-call et get-global
    Bonjour,

    J'ai besoin d'un peu d'aide pour ces fonctions get-call et get-global.

    C'est pour un exercice, je dois créer ces deux fonction.
    get-call retourne une liste des fonctions appelées dans une fonction.
    get-global retourne une liste des variables globales d'une fonction.

    Pour l'instant j'ai fait get-call qui semble fonctionner mais qui n'est pas optimale du tout !

    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
    (defun get-call (function &aux (call nil))
      (setq body (flaten (car (subseq function 3))))
      (loop for value in body do
        (if (and
              (not (eq value (car (subseq fun 1 2))))
              (member value funlist)
              (not (member value call)) )
            (setq call (append (list value) call)) ) )
      call )
     
    (defun flaten (liste)
      (cond
      ((atom liste) nil)
      ((listp (car liste)) (append (flaten (car liste)) (flaten (cdr liste))))
      (t (cons (car liste) (flaten (cdr liste)))) ) )
     
    (defun getdef (function) (car (get function 'system::definition)))
    Je commence par lier fun à la définition de la fonction ajoute grâce à getdef.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    > (setq fun (getdef 'ajoute))
    (DEFUN AJOUTE (W TREE)
     (COND ((NOT TREE) (LIST W))
      ((FRENCH-STRING>= W (CAR TREE))
       (LIST (CAR TREE) (CADR TREE) (AJOUTE W (CADDR TREE))))
      ((APPEND (LIST (CAR TREE)) (CONS (AJOUTE W (CADR TREE)) NIL)
        (CADDR TREE)))))
    Puis j'utilise get-call pour obtenir la liste des fonctions appelées dans ajoute.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    (get-call fun)
    (FRENCH-STRING>=)
    Bon ça marche mais je pense qu'il y a possibilité de faire ça beaucoup plus simplement, cependant c'est tout ce que j'ai trouvé.

    Quant à la fonction get-global je n'ai vraiment pas d'idée.

    Merci d'avance pour votre aide !

  2. #2
    Expert confirmé
    Homme Profil pro
    Développeur informatique en retraite
    Inscrit en
    Avril 2008
    Messages
    2 101
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Côtes d'Armor (Bretagne)

    Informations professionnelles :
    Activité : Développeur informatique en retraite

    Informations forums :
    Inscription : Avril 2008
    Messages : 2 101
    Points : 5 849
    Points
    5 849
    Par défaut
    Citation Envoyé par Self-Mao Voir le message
    Puis j'utilise get-call pour obtenir la liste des fonctions appelées dans ajoute.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    (get-call fun)
    (FRENCH-STRING>=)
    La variable globale 'funlist' apparaît seulement en consultation dans ton code.
    Est-ce une contrainte du problème?
    Contient-elle une liste des fonctions potentiellement à retourner par get-call?
    Sinon, get-call ne devrait-elle pas retourner toutes les fonctions appelées?
    En l'occurrence (et aux erreurs d'expérience près), pour AJOUTE, il s'agirait de retourner:
    (COND NOT LIST FRENCH-STRING>= CAR CADR AJOUTE CADDR APPEND CONS)
    D'ailleurs, de cette manière, on voit la récursivité: (member 'AJOUTE (get-call 'AJOUTE))

    D'autre part, dans la plupart des lisps (mais pas en scheme, je crois), un même symbole peut servir de variable ou de fonction (il y a 2 espaces de noms distincts).
    Que donne ta fonction get-call sur cette fonction:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    (defun foo (x)
      (let ((FRENCH-STRING>= 3))
        (+ FRENCH-STRING>= x)))
    Si elle retourne (FRENCH-STRING>=), alors il y a un problème car la fonction foo n'appelle PAS la fonction FRENCH-STRING>= mais utilise une variable locale de même nom (juste pour faire ch*er, évidemment!).
    C'est là qu'on voit les limites d'un flaten un peu brutal!
    Pour être rigoureux, il faut écrire un vrai parser du code de la fonction (et c'est du boulot! (mais, de toute façon, c'est ce qu'il te faut pour get-global!)).
    Le parser doit être capable de distinguer les symboles qui sont utilisés en position fonctionnelle des symboles qui sont utilisés en tant que variable.
    En 1ère approximation, les symboles en tête de liste sont des fonctions alors que les symboles apparaissant aux autres positions d'une liste sont des arguments, donc des variables...
    mais ce n'est qu'une grossière approximation qui, toutefois, donne la base du parsing d'une s-expr "normale".
    Pour une s-expr commençant par 'cond', il faut écrire autre chose (car, en gros, les clauses commencent par 2 parenthèses ouvertes), de même pour une s-expr commençant par 'let'...
    Tu peux t'inspirer de la discussion concernant la "Récusivité (sic!) terminale" et notamment du post #8.
    Bon courage!

Discussions similaires

  1. [Python 2.X] if '*' or '/' in (E1.get() or E2.get() or E3.get())
    Par adrbessy dans le forum Tkinter
    Réponses: 8
    Dernier message: 01/08/2014, 23h55
  2. [PowerShell] Get-WMIHelp : un Get-Help pour WMI
    Par I'm_HERE dans le forum Scripts/Batch
    Réponses: 1
    Dernier message: 10/03/2012, 19h45
  3. [PHP 5.3] Globale variable avec GET
    Par 3logy dans le forum Langage
    Réponses: 4
    Dernier message: 08/05/2010, 09h11
  4. Réponses: 0
    Dernier message: 19/06/2009, 11h18
  5. [Tableaux] Register global off et GET
    Par vodasan dans le forum Langage
    Réponses: 4
    Dernier message: 31/07/2006, 17h08

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