comment savoir a quel moment une variable est changée ?
Le
Gilles Pion

Bonjour à tous,
m'arrive un truc étrange,
à La fin de l'initialisation de ma session emacs, la contenu de la variable
"ange-ftp-ftp-program-name" se retrouve avoir pour valeur "lftp" alors que je
souhaite lui conserver la valeur par défaut, "ftp", que j'observe en "mode sans
échec" ("emacs -Q")
Pour en avoir le coeur net j'ai ajouté en début de mon .emacs:
(defconst ange-ftp-ftp-program-name "ftp")
(message "[1] ange-ftp-ftp-program-name is "%s" " ange-ftp-ftp-program-name)
et a la fin
(message "[2] ange-ftp-ftp-program-name is "%s" " ange-ftp-ftp-program-name)
et voici le résultat:
[1] ange-ftp-ftp-program-name is "ftp"
Loading
/../
[2] ange-ftp-ftp-program-name is "lftp"
Comment est-il possinle d'une valeur constante soit modifié a l'insu de mon
plein gres?
Comment savoir ou cela se passe?
Comment l'empécher?
Merci d'avance!
--
Gilles Pion
m'arrive un truc étrange,
à La fin de l'initialisation de ma session emacs, la contenu de la variable
"ange-ftp-ftp-program-name" se retrouve avoir pour valeur "lftp" alors que je
souhaite lui conserver la valeur par défaut, "ftp", que j'observe en "mode sans
échec" ("emacs -Q")
Pour en avoir le coeur net j'ai ajouté en début de mon .emacs:
(defconst ange-ftp-ftp-program-name "ftp")
(message "[1] ange-ftp-ftp-program-name is "%s" " ange-ftp-ftp-program-name)
et a la fin
(message "[2] ange-ftp-ftp-program-name is "%s" " ange-ftp-ftp-program-name)
et voici le résultat:
[1] ange-ftp-ftp-program-name is "ftp"
Loading
/../
[2] ange-ftp-ftp-program-name is "lftp"
Comment est-il possinle d'une valeur constante soit modifié a l'insu de mon
plein gres?
Comment savoir ou cela se passe?
Comment l'empécher?
Merci d'avance!
--
Gilles Pion
Bon, laissez tomber, j'ai trouvé: c'était des restes d'un vieux test au fin fond
d'un .el lu indirectement par mon .emacs:
(setq ange-ftp-ftp-program-name "lftp")
Par contre, je reste quand même étonné qu'un setq d'une constante ne fasse pas
tilter le moteur elisp.
--
Gilles Pion
defconst n'a qu'une valeur indicative :
http://www.gnu.org/software/emacs/manual/html_node/elisp/Defining-Variables.html
--
DW
En effet, je constate après lecture.
Pas d'alternative pour rendre une variable réellement "readonly" alors?
--
Gilles Pion
A ma connaissance, non, mais je ne suis pas de très près tout ce qui se
passe côté développement du coeur d'Emacs. Il y avait eu une courte
discussion en 2004, qui n'avait rien donné :
http://lists.gnu.org/archive/html/emacs-devel/2004-11/msg00561.html
--
DW
merci pour le lien en tout cas
--
Gilles Pion
Sinon pour trouver quand la variable est configurée, tu pourrais faire
un paquetage qui redéfinit la fonction set pour ouvrir le débogueur quand
c'est le symbole de la variable problématique et charger ce paquetage en
ligne de commande juste avant le fichier d'init.
Vincent.
Je vois a peu prés le principe, bien que je ne connaisse pas le concept de
"paquetage"
Par contre, je me demande comment, à l'intérieur de ma fonction "set", invoquer
la vraie fonction "set" ensuite sans partir en boucle infinie?
--
Gilles Pion
Regarde la fonction 'defadvice' (qui est une macro d'ailleurs).
Sinon, tu peux "patche"r une fonction à la mano de la manière suivante:
(le 'unless' permet d'être sûr de ne l'exécuter qu'une fois
et d'avoir la vraie définition originelle!
(attention d'utiliser un nom unique, et le même aux 3 endroits!
(et de ne pas changer de nom en cours de développement!)))
(unless (fboundp 'jd-orig-set)
(fset 'jd-orig-set (symbol-function 'set)))
(defun set (var val)
(if (eq var 'toto) (backtrace))
(jd-orig-set var val))
merci pour l'exemple, je le copie illico dans "knowledge base" perso.
--
Gilles Pion