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

9 réponses
Avatar
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

9 réponses

Avatar
Gilles Pion
Ref: de Gilles Pion
Comment est-il possible d'une valeur constante soit modifié a l'insu de mon
plein gres?
Comment savoir ou cela se passe?
Comment l'empécher?





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
Avatar
Damien Wyart
* Gilles Pion in fr.comp.applications.emacs:
Par contre, je reste quand même étonné qu'un setq d'une constante ne
fasse pas tilter le moteur elisp.



defconst n'a qu'une valeur indicative :
http://www.gnu.org/software/emacs/manual/html_node/elisp/Defining-Variables.html

--
DW
Avatar
Gilles Pion
Ref: <5167fb37$0$1834$ de Damien Wyart
defconst n'a qu'une valeur indicative :
http://www.gnu.org/software/emacs/manual/html_node/elisp/Defining-Variables.html



En effet, je constate après lecture.

Pas d'alternative pour rendre une variable réellement "readonly" alors?
--
Gilles Pion
Avatar
Damien Wyart
* Gilles Pion
in fr.comp.applications.emacs:
Pas d'alternative pour rendre une variable réellement "readonly" alors?



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
Avatar
Gilles Pion
Ref: <516856e7$0$2230$ de Damien Wyart
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



merci pour le lien en tout cas
--
Gilles Pion
Avatar
vincent.belaiche
Gilles Pion writes:

Ref: <516856e7$0$2230$ de Damien Wyart
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



merci pour le lien en tout cas



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.
Avatar
Gilles Pion
Ref: de Vincent Belaïche


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.



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
Avatar
duthen.cnv
Le mardi 16 avril 2013 20:17:29 UTC+2, Gilles Pion a écrit :
de Vincent Belaïche
Par contre, je me demande comment, à l'intérieur de ma fonction "set" ,

invoquer la vraie fonction "set" ensuite sans partir en boucle infinie?



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))
Avatar
Gilles Pion
Ref: de



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