Quelle est la différence entre setq
et defvar
dans Emacs lisp?
Je vois une version lisp courante de la même question sur /programming/3855862 . Sont-ils les mêmes dans Elisp?
Quelle est la différence entre setq
et defvar
dans Emacs lisp?
Je vois une version lisp courante de la même question sur /programming/3855862 . Sont-ils les mêmes dans Elisp?
Vous devriez poser cette question à Emacs :, C-h i
choisissez le manuel Elisp ( m Elisp
), et recherchez l'index "defvar" ( i defvar
). Cela vous amène au nœud Définition des variables .
Emacs vous indique que defvar
permet de joindre une chaîne de doc , et que si la variable a déjà une valeur, elle ne fait rien .
Il vous indique également sur l'utilisation de defvar
sans valeur à attribuer: (defvar foo)
. Il vous indique que cela déclare que la variable a une portée dynamique .
setq
n'a aucune de ces propriétés.
defvar
et setq
sont similaires, mais pas tout à fait les mêmes, dans Emacs Lisp et Common Lisp.
defvar
c'est une variable globale (comme dans le style de programmation impératif) et une convention pour la personnalisation, tandis que setq est plus comme une liaison let dans les langages de programmation fonctionnels (avec une règle de portée dynamique / lexicale selon le mode de portée global qui est actif. .......)setq
définit une valeur var, que la var (occurrence) soit locale ou non.defvar
déclare un var comme global. (Il peut également être « tampon local »:local-variable-p
.) Un événement de var lié comme un argument de la fonction oulet
est « local » dans le sens habituel. Si un var lié parlet
etc. est global (ou buffer-local) alors une liaison locale (sens habituel) est créée pour lui, pour la durée / portée de celalet
. Dans cette portée de liaison,setq
modifie la valeur locale. Il vaut mieux parler d'une occurrence de var étant locale (sur la pile) ou globale (sur le tas) qu'une var étant ainsi.M-x report-emacs-bug
de suggérer des améliorations qui pourraient aider les autres à le faire plus facilement.