Apa perbedaan antara setq
dan defvar
di Emacs lisp?
Saya melihat versi umum lump dari pertanyaan yang sama di /programming/3855862 . Apakah mereka sama di Elisp?
Apa perbedaan antara setq
dan defvar
di 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 i
pilih manual Elisp ( m Elisp
), dan cari indeks untuk "defvar" ( i defvar
). Itu akan membawa Anda ke node Mendefinisikan Variabel .
Emacs memberi tahu Anda bahwa defvar
memungkinkan melampirkan string doc , dan bahwa jika variabel sudah memiliki nilai maka tidak ada artinya .
Ia juga memberitahu Anda tentang penggunaan defvar
dengan tidak ada nilai ditugaskan: (defvar foo)
. Ini memberitahu Anda bahwa yang menyatakan variabel untuk dicakup secara dinamis .
setq
tidak memiliki properti tersebut.
defvar
dan setq
serupa, tetapi tidak persis sama, di Emacs Lisp dan Common Lisp.
defvar
variabel 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 .. .......)
setq
menetapkan nilai var, terlepas dari apakah var (kejadian) adalah lokal. defvar
mendeklarasikan var sebagai global. (Ini mungkin juga "buffer-local":. local-variable-p
) Suatu kejadian var terikat sebagai fungsi arg atau oleh let
adalah "lokal" dalam arti biasa. Jika var terikat oleh let
dll. 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, setq
mengubah nilai lokal. Lebih baik berbicara tentang kejadian var menjadi lokal (di stack) atau global (di tumpukan) daripada var begitu.
M-x report-emacs-bug
untuk menyarankan perbaikan yang mungkin membantu orang lain untuk membuatnya lebih mudah.