Как я могу вернуть "ноль"?

18

Я случайно запустил следующее:

(unintern variable)

где variableзначение было nil.

Как мне nilвернуться без перезапуска Emacs?

Шон Оллред
источник
3
+1 за то, что заставил меня посмеяться. :-) Не в снисходительной манере, а в стиле «я бы тоже так сделал».
Малабарба
@Malabarba :) Это было действительно унизительное осознание, когда я понял, что я сделал
Шон Оллред
1
Вы можете удалить ноль! Не ожидал этого.
Гамбо
@Gambo я тоже не сделал :)
Шон Оллред

Ответы:

19

(defconst nil ())

кажется, имеет правильный эффект; обратите внимание, что nilи пустой список неразличимы в Emacs Lisp.

Я посмотрел, lread.c:4034чтобы увидеть, как nilсоздается в obarray.

Обратите внимание на комментарий в строке 3896 вlread.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"); */

Это объясняет, почему Emacs не защищает от (unintern nil)и (unintern t).

Константин
источник
Очень умно! Я согласен с Stefэтим на самом деле :) Вниз по этой дороге лежит безумие.
Шон Оллред
BLEH. Я согласен с RMS над см здесь. Uninterning nil- распространенная ошибка, от которой легко защититься. Зачем ставить перила на лестнице, когда люди могут перепрыгнуть через нее?
Жиль "ТАК - перестань быть злым"
@ Жиль Я думаю об этом так же, как и о C: C поддерживает философию, согласно которой программист знает, что он делает, и просто требует способа самовыражения. ИМО, мы должны рассматривать emacs lisp как язык ассемблера emacs; более высокие абстракции (и охранники / функции) должны быть добавлены на языке, который компилируется в elisp. Но это, безусловно, тема для другого средства массовой информации :)
Шон Оллред
uninternне часто используется, на самом деле. С его помощью на магистральном obarrayдовольно много всегда плохая идея (поэтому байты-компилятор жалуется , когда вы не пройти второй аргумент, и C-h f uninternне сказать, что второй аргумент на самом деле еще не обязательно).
Стефан
@Stefan Казалось бы, это ошибка документации, то :(
Шон Оллред