Przypadkowo uruchomiłem następujące:
(unintern variable)
gdzie variable
była wartość nil
.
Jak mogę nil
wrócić bez ponownego uruchamiania Emacsa?
Przypadkowo uruchomiłem następujące:
(unintern variable)
gdzie variable
była wartość nil
.
Jak mogę nil
wrócić bez ponownego uruchamiania Emacsa?
Odpowiedzi:
(defconst nil ())
wydaje się mieć właściwy efekt; zwróć uwagę, że nil
i pusta lista jest nie do odróżnienia w Emacs Lisp.
Spojrzałem, lread.c:4034
aby zobaczyć, jak nil
powstaje w obarray
.
Zwróć uwagę na komentarz w wierszu 3896 wlread.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"); */
To wyjaśnia, dlaczego Emacs nie chroni przed (unintern nil)
i (unintern t)
.
Stef
tym, właściwie :) Na tej drodze leży szaleństwo.
nil
jest częstym błędem, przed którym można łatwo się zabezpieczyć. Po co umieszczać poręcz na schodach, skoro ludzie mogliby przez nią przeskoczyć?
unintern
tak naprawdę nie jest często używany. Używanie go na main obarray
jest prawie zawsze złym pomysłem (dlatego kompilator bajtów narzeka, gdy nie przejdziesz drugiego argumentu i C-h f unintern
nie mówi ci, że drugi argument jest nadal opcjonalny).