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?


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


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
Dengan menggunakan situs kami, Anda mengakui telah membaca dan memahami Kebijakan Cookie dan Kebijakan Privasi kami.
Licensed under cc by-sa 3.0 with attribution required.