Peux tu écrire du code pour les fonction que tu propose, car cela me parrait impossible.
J'en suis bien incapable, ne programmant pas en Lisp, cependant si on croit qu'on peut travailler sur une fonction comme si c'était une liste d'instructions on peut utiliser la stratégie suivante:
On définit find-global-variables-loop (abrégé fgvl) récursive, qui prend en argument une liste L (ensemble) de symboles correspondant aux variables liées et une expression X:
— Si X est un appel de fonction (f a1 … an) alors il faut renvoyer «les ai qui ne sont pas dans L».
— Si X est une séquence x1 … xn d'expressions, il faut renvoyer l'union des (fgvl L xi).
— Si X est une alternative p1 x1 p2 x2 … il faut renvoyer l'union des (fgvl L pi) et des (fgvl L xi), je note pi les prédicats du cond et xi les expressions associées.
— Si X est un let de a1 v1, a2 v2 … sur x il faut renvoyer l'union des (fgvl L vi) avec (fgvl L' x) où L' est déduit de L en ajoutant les ai.
Qu'est ce que cela veut il dire? des variables sont glabales ou ne sont pas globales.
Je voulais dire «référencées» dans f.
Pour celle la il suffit de copier toutes les varaibles globales, appeler "f" puis réécrire les varaibles globales précédament stockées.
Oui, en utilisant find-global-variables pour obtenir la liste des variables en question.
>(defun trace-variable (f symbol) …) => fonction ayant le même effet que f mais affiche toutes les modifications de la variable symbol
Comment?
En remplaçant les instructions de type (set a …) par une séquence (set a …) suivie de (output a …) et en changeant le corps des fonctions où a est en argument pour afficher la valeur de a avant le traitement.
PS: j'ai moinssé par erreur ton commentaire, dans un grand moment d'égarement psychomoteur… j'espère que tu ne m'en voudras pas!
[^] # Re: L'exemple du lisp
Posté par Michaël (site web personnel) . En réponse au message Homoiconicité. Évalué à 4.
J'en suis bien incapable, ne programmant pas en Lisp, cependant si on croit qu'on peut travailler sur une fonction comme si c'était une liste d'instructions on peut utiliser la stratégie suivante:
On définit find-global-variables-loop (abrégé fgvl) récursive, qui prend en argument une liste L (ensemble) de symboles correspondant aux variables liées et une expression X:
— Si X est un appel de fonction (f a1 … an) alors il faut renvoyer «les ai qui ne sont pas dans L».
— Si X est une séquence x1 … xn d'expressions, il faut renvoyer l'union des (fgvl L xi).
— Si X est une alternative p1 x1 p2 x2 … il faut renvoyer l'union des (fgvl L pi) et des (fgvl L xi), je note pi les prédicats du cond et xi les expressions associées.
— Si X est un let de a1 v1, a2 v2 … sur x il faut renvoyer l'union des (fgvl L vi) avec (fgvl L' x) où L' est déduit de L en ajoutant les ai.
Je voulais dire «référencées» dans f.
Oui, en utilisant
find-global-variablespour obtenir la liste des variables en question.En remplaçant les instructions de type (set a …) par une séquence (set a …) suivie de (output a …) et en changeant le corps des fonctions où
aest en argument pour afficher la valeur deaavant le traitement.PS: j'ai moinssé par erreur ton commentaire, dans un grand moment d'égarement psychomoteur… j'espère que tu ne m'en voudras pas!