J'ai accidentellement exécuté ce qui suit:
(unintern variable)
où variableétait la valeur nil.
Comment récupérer nilsans redémarrer Emacs?
J'ai accidentellement exécuté ce qui suit:
(unintern variable)
où variableétait la valeur nil.
Comment récupérer nilsans redémarrer Emacs?
Réponses:
(defconst nil ())
semble avoir le bon effet; notez que nilet une liste vide sont indiscernables dans Emacs Lisp.
J'ai regardé lread.c:4034pour voir comment nilest 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).
Stefcelui-ci, en fait :) En bas de cette route se trouve la folie.
nilest une erreur courante facile à protéger. Pourquoi mettre une main courante sur un escalier alors que les gens pouvaient sauter par-dessus?
uninternn'est pas utilisé fréquemment, vraiment. L'utiliser sur le principal obarrayest à 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 uninternne vous dit pas que le deuxième argument est en fait toujours facultatif).