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 !