Tout comme ailleurs, les différences entre ces commandes ont augmenté en raison de l'introduction de la liaison lexicale, bien que ces différences ne sont pas vraiment utiles que si vous voulez juste pour personnaliser certaines variables.
L' def...
des constructions de déclarer des variables globales. L' set...
fonctions de l' ensemble des variables, que ce soit local ou global. Lors de l' x
n'est ni une variable locale (un paramètre formel de la fonction actuelle ou déclarée, par un let
formulaire ou similaire), ni définie par un def...
formulaire et vous écrivez (setq x 0)
de l'octet compilateur va même montrer un avertissement
Warning: assignment to free variable `x'
Les Variables déclarées avec defvar
, defcustom
, defconst
sont dynamiquement lié, c'est à dire quand vous avez une construction
(let ((lisp-indent-offset 2))
(pp (some-function)))
la fonction some-function
va voir le changement de la variable globale lisp-indent-offset
.
Lorsqu'une variable n'est pas dynamiquement lié, à quelque chose comme
(let ((my-local-var 1))
(some-function))
où my-local-var
n'a pas de valeur mondiales, alors some-function
ne verrez pas la valeur assignée, comme il est lexicalement étendue.
D'autre part, de façon dynamique étendue variables de ne pas être capturée lexicale fermetures.
Plus de détails peuvent être vus dans http://www.gnu.org/software/emacs/manual/html_node/elisp/Lexical-Binding.html