Come posso riportare "zero"?


18

Ho accidentalmente eseguito quanto segue:

(unintern variable)

dov'era variableil valore nil.

Come posso niltornare senza riavviare Emacs?


3
+1 per avermi fatto ridere. :-) Non in modo condiscendente, ma in un modo "lo avrei fatto del tutto anch'io".
Malabarba,

@Malabarba :) È stata davvero una realizzazione umiliante quando ho capito cosa avevo fatto
Sean Allred,

1
Puoi eliminare zero! Non l'ho visto arrivare.
Gambo,

@Gambo neanche io :)
Sean Allred

Risposte:


19

(defconst nil ())

sembra avere l'effetto giusto; si noti che nile un elenco vuoto sono indistinguibili in Emacs Lisp.

Ho guardato lread.c:4034per vedere come nilè stato creato in un obarray.

Nota il commento alla riga 3896 inlread.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"); */

Questo spiega perché Emacs non protegge da (unintern nil)e (unintern t).


Molto intelligente! Sono d'accordo con Stefquesto, in realtà :) In fondo a quella strada c'è la follia.
Sean Allred,

Bleh. Sono d'accordo con rms su sm qui. Il disinteresse nilè un errore comune contro il quale è facile proteggerlo. Perché mettere un corrimano su una scala quando le persone potrebbero saltarci sopra?
Gilles 'SO- smetti di essere malvagio'

@Gilles Penso a questo mentre penso a C: C mantiene la filosofia secondo cui il programmatore sa cosa sta facendo e richiede semplicemente un modo per esprimersi. IMO, dovremmo considerare emacs lisp come il linguaggio assembly di emacs; astrazioni più elevate (e guardie / caratteristiche) dovrebbero essere aggiunte in una lingua che si compili in elisp. Ma questo è sicuramente un argomento per un altro mezzo :)
Sean Allred

uninternnon viene usato frequentemente, davvero. Usarlo sul main obarrayè praticamente sempre una cattiva idea (motivo per cui il compilatore di byte si lamenta quando non si riesce a passare il secondo argomento e C-h f uninternnon ti dice che il secondo argomento è in realtà ancora facoltativo).
Stefan,

@Stefan Sembrerebbe che sia un bug di documentazione, quindi :(
Sean Allred il
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.