Ho accidentalmente eseguito quanto segue:
(unintern variable)
dov'era variable
il valore nil
.
Come posso nil
tornare senza riavviare Emacs?
Ho accidentalmente eseguito quanto segue:
(unintern variable)
dov'era variable
il valore nil
.
Come posso nil
tornare senza riavviare Emacs?
Risposte:
(defconst nil ())
sembra avere l'effetto giusto; si noti che nil
e un elenco vuoto sono indistinguibili in Emacs Lisp.
Ho guardato lread.c:4034
per 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)
.
Stef
questo, in realtà :) In fondo a quella strada c'è la follia.
nil
è un errore comune contro il quale è facile proteggerlo. Perché mettere un corrimano su una scala quando le persone potrebbero saltarci sopra?
unintern
non 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 unintern
non ti dice che il secondo argomento è in realtà ancora facoltativo).