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
Vidéos High-Tech et Jeu Vidéo
Téléchargements
Vos réponses
Gagnez chaque mois un abonnement Premium avec GNT : Inscrivez-vous !
Trier par : date / pertinence
Gilles Pion
Le #25334792
Ref:
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
Damien Wyart
Le #25334972
* Gilles Pion
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
Gilles Pion
Le #25336132
Ref:
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
Damien Wyart
Le #25336502
* 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
Gilles Pion
Le #25336642
Ref:
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
vincent.belaiche
Le #25344182
Gilles Pion
Ref:
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.
Gilles Pion
Le #25345502
Ref:

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
duthen.cnv
Le #25349382
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))
Gilles Pion
Le #25350252
Ref:


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
Publicité
Poster une réponse
Anonyme