Ho accidentalmente eseguito quanto segue:
(unintern variable)
dov'era variableil valore nil.
Come posso niltornare senza riavviare Emacs?
Ho accidentalmente eseguito quanto segue:
(unintern variable)
dov'era variableil valore nil.
Come posso niltornare senza riavviare Emacs?
Risposte:
(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).
Stefquesto, 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?
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).