Bagaimana saya bisa mengembalikan `nil`?

18

Saya tidak sengaja menjalankan yang berikut ini:

(unintern variable)

dimana variablenilainya nil.

Bagaimana saya nilkembali tanpa memulai ulang Emacs?

Sean Allred
sumber
3
+1 untuk membuat saya tertawa. :-) Tidak dengan cara merendahkan, tetapi dengan cara "Saya akan benar-benar melakukannya juga".
Malabarba
@Malabarba :) Itu benar-benar realisasi yang merendahkan ketika saya tahu apa yang telah saya lakukan
Sean Allred
1
Anda dapat menghapus nihil! Tidak melihat itu datang.
Gambo
@ Gambo juga tidak saya :)
Sean Allred

Jawaban:

19

(defconst nil ())

tampaknya memiliki efek yang tepat; perhatikan itu nildan daftar kosong tidak dapat dibedakan dalam Emacs Lisp.

Saya melihat lread.c:4034untuk melihat bagaimana nildibuat dalam obarray.

Perhatikan komentar di baris 3896 dilread.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"); */

Ini menjelaskan mengapa Emacs tidak melindungi (unintern nil)dan (unintern t).

Constantine
sumber
Sangat pintar! Saya setuju dengan Stefyang ini, sebenarnya :) Di jalan itu ada kegilaan.
Sean Allred
Bleh. Saya setuju dengan rms di sini. Uninterning niladalah kesalahan umum yang mudah dilindungi. Mengapa meletakkan pegangan tangan di tangga ketika orang bisa melompatinya?
Gilles 'SO- stop being evil'
@Gilles Saya berpikir tentang ini ketika saya berpikir tentang C: C mempertahankan filosofi bahwa programmer tahu apa yang dia lakukan dan hanya membutuhkan cara untuk mengekspresikan dirinya. IMO, kita harus menganggap emacs lisp sebagai bahasa rakitan emacs; abstraksi yang lebih tinggi (dan penjaga / fitur) harus ditambahkan dalam bahasa yang mengkompilasi ke elisp. Tapi itu sudah pasti menjadi topik untuk media lain :)
Sean Allred
uninterntidak sering digunakan, sungguh. Menggunakannya pada main obarrayhampir selalu merupakan ide yang buruk (itulah sebabnya byte-compiler mengeluh ketika Anda gagal melewati argumen kedua, dan C-h f uninterntidak memberi tahu Anda bahwa argumen kedua sebenarnya masih opsional).
Stefan
@Stefan Tampaknya itu adalah bug dokumentasi, lalu :(
Sean Allred