¿Cómo puedo traer de vuelta `nil`?

18

Accidentalmente ejecuté lo siguiente:

(unintern variable)

donde variableestaba el valor nil.

¿Cómo nilregreso sin reiniciar Emacs?

Sean Allred
fuente
3
+1 por hacerme reír. :-) No de una manera condescendiente, sino de una manera "yo también lo habría hecho totalmente".
Malabarba
@Malabarba :) Fue realmente una comprensión humillante cuando descubrí lo que había hecho
Sean Allred, el
1
Puedes eliminar nil! No lo vi venir.
Gambo
@Gambo tampoco lo hice :)
Sean Allred

Respuestas:

19

(defconst nil ())

parece tener el efecto correcto; tenga en cuenta que nily una lista vacía no se puede distinguir en Emacs Lisp.

Miré lread.c:4034para ver cómo nilse crea en un obarray.

Tenga en cuenta el comentario en la línea 3896 enlread.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"); */

Esto explica por qué Emacs no protege contra (unintern nil)y (unintern t).

Constantina
fuente
¡Muy inteligente! Estoy de acuerdo con Stefesto, en realidad :) En ese camino se encuentra la locura.
Sean Allred
Bleh Estoy de acuerdo con rms sobre sm aquí. Uninterning niles un error común contra el cual es fácil protegerse. ¿Por qué poner un pasamanos en una escalera cuando la gente puede saltar sobre ella?
Gilles 'SO- deja de ser malvado'
@Gilles Pienso en esto como pienso en C: C mantiene la filosofía de que el programador sabe lo que está haciendo y simplemente requiere una forma de expresarse. En mi opinión, debemos considerar emacs lisp como el lenguaje ensamblador de emacs; Se deben agregar abstracciones más altas (y guardias / características) en un lenguaje que se compile para elisp. Pero ese es ciertamente un tema para otro medio :)
Sean Allred
uninternno se usa con frecuencia, de verdad. Usarlo en el main obarrayes casi siempre una mala idea (razón por la cual el compilador de bytes se queja cuando no pasa el segundo argumento, y C-h f uninternno le dice que el segundo argumento todavía es opcional).
Stefan
@Stefan Parece que es un error de documentación, entonces :(
Sean Allred