OVH Cloud OVH Cloud

setq et defvar

7 réponses
Avatar
Sébastien Kirche
Bonjour,

j'avance doucement sur emacs lisp et j'en profite pour remanier mes fichiers
de conf.

Ma question du moment est quelle différence entre un setq et defvar pour
définir une variable par example dans .emacs pour se référer à un répertoire
ou créer une chaîne ?

Est-ce que defvar est simplement plus propre car il permet de documenter la
variable ?

--
Sébastien Kirche

7 réponses

Avatar
Vincent Bernat
OoO En cette fin de matinée radieuse du mardi 05 avril 2005, vers
11:33, Sébastien Kirche
disait:

j'avance doucement sur emacs lisp et j'en profite pour remanier mes fichiers
de conf.

Ma question du moment est quelle différence entre un setq et defvar pour
définir une variable par example dans .emacs pour se référer à un répertoire
ou créer une chaîne ?

Est-ce que defvar est simplement plus propre car il permet de documenter la
variable ?



Quand tu compiles et que tu utilises setq, il peut se plaindre de ne
pas connaître la variable en question. Mais je suppose qu'avec defvar,
il peut se plaindre qu'elle existe déjà.
--
BOFH excuse #93:
Feature not yet implimented
Avatar
Pascal Bourguignon
Sébastien Kirche writes:

Bonjour,

j'avance doucement sur emacs lisp et j'en profite pour remanier mes fichiers
de conf.

Ma question du moment est quelle différence entre un setq et defvar pour
définir une variable par example dans .emacs pour se référer à un répertoire
ou créer une chaîne ?



setq assigne une variable.

(setq x 1)
(setq x 2)
(assert (= x 2))


defvar crée une variable (et n'assigne la valeur initiale que si la
variable n'existait pas!)

(defvar y 1)
(defvar y 2)
(assert (= y 1))


Est-ce que defvar est simplement plus propre car il permet de documenter la
variable ?



Si c'est une variable qui existe déjà, utiliser setq. Si on défini une
nouvelle variable utiliser defvar. En plus, ça permet d'indiquer
quelles variables sont utilisable avec la commande set-variable:

(defvar exemple1 1 "*Une variable utilisable dans M-x set-variable ")
(defvar exemple2 2 "Une variable normale.")
(setq exemple3 3)

M-x set-variable RET exemple TAB TAB


--
__Pascal Bourguignon__ http://www.informatimago.com/
Wanna go outside.
Oh, no! Help! I got outside!
Let me back inside!
Avatar
Xavier Maillard
On 5 Apr 2005, Vincent Bernat wrote:

OoO En cette fin de matinée radieuse du mardi 05 avril 2005,
vers 11:33, Sébastien Kirche
disait:

> j'avance doucement sur emacs lisp et j'en profite pour
> remanier mes fichiers de conf.

> Ma question du moment est quelle différence entre un setq et
> defvar pour définir une variable par example dans .emacs pour
> se référer à un répertoire ou créer une chaîne ?

> Est-ce que defvar est simplement plus propre car il permet de
> documenter la variable ?

Quand tu compiles et que tu utilises setq, il peut se plaindre
de ne pas connaître la variable en question. Mais je suppose
qu'avec defvar, il peut se plaindre qu'elle existe déjà.



Exact mais je croyais que les devel Emacs avaient entammé un
petit travail de chasse aux Warnings pour ces cas là.

Enfin pas grave, de toute façon que tu utilises l'un ou l'autre
ne change rien sauf si tu veux faire un M-x set-variable.

Pour une variable existante, le setq s'impose pour définir une
autre variable defvar (entre autre) doit être recommandé (plus
propre).

Vala.
--
.o. Xavier Maillard Tel: +33 6 68 04 64 37
..o
ooo
Avatar
Sébastien Kirche
Le 5 Apr 2005, Pascal Bourguignon vraute :

setq assigne une variable.



[...]

defvar crée une variable (et n'assigne la valeur initiale que si la
variable n'existait pas!)



Ok. Mais si la variable n'existe pas au setq, il la crée aussi...

> Est-ce que defvar est simplement plus propre car il permet de documenter
> la variable ?

Si c'est une variable qui existe déjà, utiliser setq. Si on défini une
nouvelle variable utiliser defvar.



Je vais retenir ce fonctionnement.

En plus, ça permet d'indiquer quelles variables sont utilisable avec la
commande set-variable:

(defvar exemple1 1 "*Une variable utilisable dans M-x set-variable ")
(defvar exemple2 2 "Une variable normale.")
(setq exemple3 3)

M-x set-variable RET exemple TAB TAB



Bizarrement set-variable ne me propose que exemple1 dans la completion. Je
suppose que ton illustration devait aussi signaler exemple2 ?

Quel est l'intérêt/l'usage de M-x set-variable (par rapport à M-: (setq
ma-variable) ) ? La simplicité de l'affectation ?

Merci à tous pour vos conseils.

--
Sébastien Kirche
Avatar
Vincent Bernat
OoO En ce début d'après-midi nuageux du mardi 05 avril 2005, vers
14:01, Sébastien Kirche
disait:

(defvar exemple1 1 "*Une variable utilisable dans M-x set-variable ")
(defvar exemple2 2 "Une variable normale.")
(setq exemple3 3)

M-x set-variable RET exemple TAB TAB



Bizarrement set-variable ne me propose que exemple1 dans la completion. Je
suppose que ton illustration devait aussi signaler exemple2 ?



A mon avis, il n'y a que les variables dont la documentation est étoilée.
--
BOFH excuse #140:
LBNC (luser brain not connected)
Avatar
Pascal Bourguignon
Sébastien Kirche writes:

Le 5 Apr 2005, Pascal Bourguignon vraute :

> setq assigne une variable.

[...]

> defvar crée une variable (et n'assigne la valeur initiale que si la
> variable n'existait pas!)

Ok. Mais si la variable n'existe pas au setq, il la crée aussi...



Oui (sauf que le compilateur se plaindra, car il supposera qu'on a
fait une faute de frappe dans le nom de la variable, puisqu'on ne l'a
pas déclarée...)


> > Est-ce que defvar est simplement plus propre car il permet de documenter
> > la variable ?
>
> Si c'est une variable qui existe déjà, utiliser setq. Si on défini une
> nouvelle variable utiliser defvar.

Je vais retenir ce fonctionnement.

> En plus, ça permet d'indiquer quelles variables sont utilisables avec la
> commande set-variable:
>
> (defvar exemple1 1 "*Une variable utilisable dans M-x set-variable ")
> (defvar exemple2 2 "Une variable normale.")
> (setq exemple3 3)
>
> M-x set-variable RET exemple TAB TAB

Bizarrement set-variable ne me propose que exemple1 dans la completion. Je
suppose que ton illustration devait aussi signaler exemple2 ?



Non, car il n'y a pas d'étoile au début de la documentation de exemple2.

C-h f defvar

Quel est l'intérêt/l'usage de M-x set-variable (par rapport à M-: (setq
ma-variable) ) ? La simplicité de l'affectation ?



Justement, de pouvoir sélectionner (et autocompléter) les variables
qui sont sensées  être modifiées par l'utilisateur.

Une variable déclarée sans l'étoile dans la documentation est prise
comme une variable "privée".

--
__Pascal Bourguignon__ http://www.informatimago.com/

Nobody can fix the economy. Nobody can be trusted with their finger
on the button. Nobody's perfect. VOTE FOR NOBODY.
Avatar
drkm
Sébastien Kirche writes:

Le 5 Apr 2005, Pascal Bourguignon vraute :

(defvar exemple1 1 "*Une variable utilisable dans M-x set-variable ")
(defvar exemple2 2 "Une variable normale.")
(setq exemple3 3)

M-x set-variable RET exemple TAB TAB



Bizarrement set-variable ne me propose que exemple1 dans la completion. Je
suppose que ton illustration devait aussi signaler exemple2 ?



Non. La différence peut ne pas sauter aux yeux a priori. Il s'agit
juste de l'astérisque en plus. Tu peux également essayer :

(defcustom exemple4 4 "Une option utilisateur.")

Quel est l'intérêt/l'usage de M-x set-variable (par rapport à M-: (setq
ma-variable) ) ? La simplicité de l'affectation ?



Bof. Peut-être au niveau de la complétion. Je pense qu'il s'agit
plutôt de deux approche différentes. Une variable est destinée à être
utilisée dans un programme. Une option de l'utilisateur est destinée
à être renseignée par les utilisateurs humains directement (dans
~/.emacs ou de manière interactive).

C'est cette différence que fait set-variable.

Pour ma part, je ne me sers jamais de setq pour déclarer une
nouvelle variable. Je déclare toute variable que j'utilise. Soit par
defvar, lorsqu'il s'agit juste d'une variable sensée être plus ou
moins privée, soit par defcustom s'il s'agit d'une option destinée à
la configuration.

Il m'arrive bien sûr d'utiliser setq sur des symboles n'ayant pas
encore été définis, tout simplement parce que le fichier où cela est
fait n'a pas encore été chargé.

Il faut toutefois faire attention à l'emploi de setq sur des
customs. defcustom peut en effet spécifier des actions spéciales à
entreprendre lors de l'affectation d'un custom. Mais je te renvois
pour cela au manuel ELisp.

--drkm