Apa perbedaan antara setqdan defvardi Emacs lisp?
Saya melihat versi umum lump dari pertanyaan yang sama di /programming/3855862 . Apakah mereka sama di Elisp?
Apa perbedaan antara setqdan defvardi Emacs lisp?
Saya melihat versi umum lump dari pertanyaan yang sama di /programming/3855862 . Apakah mereka sama di Elisp?
Jawaban:
Anda harus bertanya kepada Emacs pertanyaan ini :, C-h ipilih manual Elisp ( m Elisp), dan cari indeks untuk "defvar" ( i defvar). Itu akan membawa Anda ke node Mendefinisikan Variabel .
Emacs memberi tahu Anda bahwa defvarmemungkinkan melampirkan string doc , dan bahwa jika variabel sudah memiliki nilai maka tidak ada artinya .
Ia juga memberitahu Anda tentang penggunaan defvardengan tidak ada nilai ditugaskan: (defvar foo). Ini memberitahu Anda bahwa yang menyatakan variabel untuk dicakup secara dinamis .
setq tidak memiliki properti tersebut.
defvardan setqserupa, tetapi tidak persis sama, di Emacs Lisp dan Common Lisp.
defvarvariabel global (seperti dalam gaya pemrograman imperatif) dan konvensi untuk kustomisasi, sementara setq lebih seperti ikatan yang mengikat dalam bahasa pemrograman fungsional (dengan aturan pelingkupan dinamis / leksikal tergantung pada mode pelingkupan global mana yang aktif .. .......)
setqmenetapkan nilai var, terlepas dari apakah var (kejadian) adalah lokal. defvarmendeklarasikan var sebagai global. (Ini mungkin juga "buffer-local":. local-variable-p) Suatu kejadian var terikat sebagai fungsi arg atau oleh letadalah "lokal" dalam arti biasa. Jika var terikat oleh letdll. Adalah global (atau buffer-lokal) maka mengikat lokal (akal biasa) dibuat untuk itu, untuk durasi / ruang lingkup itu let. Dalam ruang lingkup yang mengikat itu, setqmengubah nilai lokal. Lebih baik berbicara tentang kejadian var menjadi lokal (di stack) atau global (di tumpukan) daripada var begitu.
M-x report-emacs-buguntuk menyarankan perbaikan yang mungkin membantu orang lain untuk membuatnya lebih mudah.