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?


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


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
Ao utilizar nosso site, você reconhece que leu e compreendeu nossa Política de Cookies e nossa Política de Privacidade.
Licensed under cc by-sa 3.0 with attribution required.