Przypadkowo uruchomiłem następujące:
(unintern variable)
gdzie variablebyła wartość nil.
Jak mogę nilwrócić bez ponownego uruchamiania Emacsa?
Przypadkowo uruchomiłem następujące:
(unintern variable)
gdzie variablebyła wartość nil.
Jak mogę nilwrócić bez ponownego uruchamiania Emacsa?
Odpowiedzi:
(defconst nil ())
wydaje się mieć właściwy efekt; zwróć uwagę, że nili pusta lista jest nie do odróżnienia w Emacs Lisp.
Spojrzałem, lread.c:4034aby zobaczyć, jak nilpowstaje 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).
Steftym, właściwie :) Na tej drodze leży szaleństwo.
niljest 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ć?
uninterntak naprawdę nie jest często używany. Używanie go na main obarrayjest prawie zawsze złym pomysłem (dlatego kompilator bajtów narzeka, gdy nie przejdziesz drugiego argumentu i C-h f uninternnie mówi ci, że drugi argument jest nadal opcjonalny).