Bonjour
à tous et à toutes.
Je bloque un peu sur la création d'un ptit soft en Clisp. Et j'aimerai quelques pistes parce que j'avoue que je sèche pas mal.
Le soft est censé lire un fichier .lisp, lister les fonctions qui sont dedans (j'en suis pas encore là) et ajouter à une liste associative la description de la fonction trouvée, exemple pour plus de clartée :
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
 
;si une fonction test-char qui test si la présence de caractère dans une liste globale, la fonction en elle même ne sert à rien elle est juste là pour l'exemple.
; Nom  :test-char
; Arguments : arg1 arg2
; global : GLOBAL
; call : member
(defun test-char (arg1 arg2)
  (cond
    ((member arg1 GLOBAL) nil)
    ((member arg2 GLOBAL) t) ) )
À partir d'une definition comme ça je récupère la méthode de définition avec
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
 
(defun getdef (function) (car (get function 'system::definition)))
 
(defun get-définisseur (fonction)
  (car (getdef fonction)))
les arguments avec
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
 
(defun get-paramètres (fonction)
  (car (cddr(getdef fonction))))
et là je bloque, je dois récupérer la ou les variables globales, j'avais donc fait quelque chose comme ç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
 
; l'argument fonction est le (cddr (getdef 'test-char)) donc la définiton de la fonciton, sans le (defun F (x y) et arguments la liste des arguments récupérée avec (get-paramètres (fonction))
(defun get-globales (fonction arguments)
  (cond
    ((atom fonction) nil)
    ((listp (car fonction)) (cons(get-globales (car fonction) arguments) (get-globales (cdr fonction) arguments)))
    ((cond
      ((equal (fboundp (car fonction)) t) (get-globales (cdr fonction) arguments))
      ((not (member (car fonction) arguments)) (cons (car fonction) (get-globales (cdr fonction) arguments)))))))
 
;
; le but final est de regrouper ces fonctions puis générer une liste associative de ce type : 
'(test-char
   (définisseur . defun)
   (paramètres arg1 arg2)
   (globales GLOBALE)
   (appelle member )

ou je teste si l'atom de la liste est une sous-liste, puis si c'est une fonction et enfin si il n'est pas membre de la liste des arguments, donc une variable globale. Mais ça ne marche pas et je sens que je suis sur une fausse piste. Ça fait un moment que j'ai pas fait de Clisp et je pense que je me plante carrément sur la méthodologie. Devrais-je executer la fonction que j'essaye de décrire et récupérer les valeurs envoyée au top-level ?

Voilà voilà. J'espère que j'ai été clair (je crois pas :/).
Merci à ceux qui voudront bien m'aider dans cette tâche qui... bah qui ne sert pas à grand à l'humanité j'en ai peur.


(ps : RIP Monsieur Hawking)


[edit : je suis tombé sur ce lien https://www.developpez.net/forums/d1...ll-get-global/ en fouillant un peu mieux. je vais aller zieuter tout ça, cependant si vous avez une idée, je suis toujours preneur. Bonne journée à vous)