Comment puis-je ramener «néant»?

18

J'ai accidentellement exécuté ce qui suit:

(unintern variable)

variableétait la valeur nil.

Comment récupérer nilsans redémarrer Emacs?

Sean Allred
la source
3
+1 pour m'avoir fait rire. :-) Pas de manière condescendante, mais de manière "j'aurais totalement fait ça aussi".
Malabarba
@Malabarba :) Ce fut vraiment une réalisation humiliante quand j'ai compris ce que j'avais fait
Sean Allred
1
Vous pouvez supprimer nil! Ne voyait pas cela venir.
Gambo
@Gambo non plus :)
Sean Allred

Réponses:

19

(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).

Constantine
la source
Très intelligent! Je suis d'accord avec Stefcelui-ci, en fait :) En bas de cette route se trouve la folie.
Sean Allred
Bleh. Je suis d'accord avec rms sur sm ici. La suppression de l'internalisation nilest une erreur courante facile à protéger. Pourquoi mettre une main courante sur un escalier alors que les gens pouvaient sauter par-dessus?
Gilles 'SO- arrête d'être méchant'
@Gilles J'y pense comme je pense à C: C maintient la philosophie selon laquelle le programmeur sait ce qu'il fait et a simplement besoin d'un moyen de s'exprimer. OMI, nous devons considérer emacs lisp comme le langage d'assemblage d'emacs; des abstractions plus élevées (et des gardes / fonctionnalités) doivent être ajoutées dans un langage qui se compile en elisp. Mais c'est certainement un sujet pour un autre média :)
Sean Allred
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).
Stefan
@Stefan Il semblerait que ce soit un bug de documentation, alors :(
Sean Allred