J'ai accidentellement exécuté ce qui suit:
(unintern variable)
où variable
était la valeur nil
.
Comment récupérer nil
sans redémarrer Emacs?
J'ai accidentellement exécuté ce qui suit:
(unintern variable)
où variable
était la valeur nil
.
Comment récupérer nil
sans redémarrer Emacs?
Réponses:
(defconst nil ())
semble avoir le bon effet; notez que nil
et une liste vide sont indiscernables dans Emacs Lisp.
J'ai regardé lread.c:4034
pour voir comment nil
est créé dans un fichier obarray
.
Notez le commentaire à la ligne 3896 danslread.c
:
/* There are plenty of other symbols which will screw up the Emacs
session if we unintern them, as well as even more ways to use
`setq' or `fset' or whatnot to make the Emacs session
unusable. Let's not go down this silly road. --Stef */
/* if (EQ (tem, Qnil) || EQ (tem, Qt))
error ("Attempt to unintern t or nil"); */
Cela explique pourquoi Emacs ne protège pas contre (unintern nil)
et (unintern t)
.
Stef
celui-ci, en fait :) En bas de cette route se trouve la folie.
nil
est une erreur courante facile à protéger. Pourquoi mettre une main courante sur un escalier alors que les gens pouvaient sauter par-dessus?
unintern
n'est pas utilisé fréquemment, vraiment. L'utiliser sur le principal obarray
est à peu près toujours une mauvaise idée (c'est pourquoi le compilateur d'octets se plaint lorsque vous ne passez pas le deuxième argument et C-h f unintern
ne vous dit pas que le deuxième argument est en fait toujours facultatif).