Jak mogę przywrócić „zero”?

18

Przypadkowo uruchomiłem następujące:

(unintern variable)

gdzie variablebyła wartość nil.

Jak mogę nilwrócić bez ponownego uruchamiania Emacsa?

Sean Allred
źródło
3
+1 za rozśmieszenie mnie. :-) Nie w protekcjonalny sposób, ale w sposób „zrobiłbym to całkowicie”.
Malabarba
@Malabarba :) To było naprawdę upokarzające zrozumienie, kiedy zorientowałem się, co zrobiłem
Sean Allred
1
Możesz usunąć zero! Nie spodziewałem się tego.
Gambo
@Gambo ja też nie :)
Sean Allred

Odpowiedzi:

19

(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).

Konstantyn
źródło
Bardzo mądry! Zgadzam się z Steftym, właściwie :) Na tej drodze leży szaleństwo.
Sean Allred
Bleh Zgadzam się z rms nad sm tutaj. Uninterning 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ć?
Gilles „SO- przestań być zły”
@Gilles Myślę o tym, gdy myślę o C: C utrzymuje filozofię, że programista wie, co robi, i po prostu potrzebuje sposobu, aby wyrazić siebie. IMO, powinniśmy uważać emacs lisp za język asemblera emacs; wyższe abstrakcje (i osłony / funkcje) powinny być dodane w języku kompilującym się w elisp. Ale to z pewnością temat na inne medium :)
Sean Allred
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).
Stefan
@Stefan Wygląda na to, że to błąd w dokumentacji, a następnie :(
Sean Allred