Como posso trazer de volta `nil`?

18

Eu acidentalmente executei o seguinte:

(unintern variable)

Onde variableestá o valor nil?

Como eu nilvolto sem reiniciar o Emacs?

Sean Allred
fonte
3
+1 por me fazer rir. :-) Não de uma maneira condescendente, mas de uma maneira "eu também teria feito isso totalmente".
Malabarba 31/10
@Malabarba :) Foi realmente uma realização humilhante quando eu descobri que eu tinha feito
Sean Allred
1
Você pode excluir nada! Não viu isso chegando.
Gambo #
@Gambo nem eu :)
Sean Allred

Respostas:

19

(defconst nil ())

parece ter o efeito certo; note que nile uma lista vazia são indistinguíveis no Emacs Lisp.

Eu olhei lread.c:4034para ver como nilé criado em um arquivo obarray.

Observe o comentário na linha 3896 emlread.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"); */

Isso explica por que o Emacs não protege contra (unintern nil)e (unintern t).

Constantine
fonte
Muito esperto! Concordo com Stefeste, na verdade :) Naquele caminho está a loucura.
Sean Allred
Bleh. Eu concordo com rms over sm aqui. O desinteresse interno nilé um erro comum e fácil de proteger. Por que colocar um corrimão em uma escada quando as pessoas podiam pular sobre ela?
Gilles 'SO- stop be evil'
@ Gilles Eu penso sobre isso como penso em C: C mantém a filosofia de que o programador sabe o que está fazendo e requer apenas uma maneira de se expressar. Na IMO, devemos considerar o emacs lisp como a linguagem assembly do emacs; abstrações mais altas (e guardas / recursos) devem ser adicionadas em um idioma que seja compilado para elisp. Mas isso é certamente um assunto para outro meio :)
Sean Allred
uninternrealmente não é usado com frequência. Usá-lo em geral obarrayé sempre uma péssima idéia (é por isso que o compilador de bytes reclama quando você não passa o segundo argumento e C-h f uninternnão diz que o segundo argumento ainda é opcional).
Stefan
@Stefan Parece que é um erro de documentação, então :(
Sean Allred