Qual'è la differenza tra setq
e defvar
in Emacs lisp?
Vedo la versione lisp comune della stessa domanda su /programming/3855862 . Sono gli stessi in Elisp?
Qual'è la differenza tra setq
e defvar
in Emacs lisp?
Vedo la versione lisp comune della stessa domanda su /programming/3855862 . Sono gli stessi in Elisp?
Risposte:
Dovresti porre a Emacs questa domanda: C-h i
scegli il manuale Elisp ( m Elisp
) e cerca "defvar" nell'indice i defvar
. Questo ti porta al nodo Definizione delle variabili .
Emacs ti dice che defvar
consente di allegare una stringa di documenti e che se la variabile ha già un valore, allora non fa nulla .
Ti dice anche circa l'uso di defvar
senza valore da assegnare: (defvar foo)
. Ti dice che ciò dichiara che la variabile ha un ambito dinamico .
setq
non ha nessuna di quelle proprietà.
defvar
e setq
sono simili, ma non uguali, in Emacs Lisp e Common Lisp.
defvar
sia una variabile globale (come nello stile di programmazione imperativo) e una convenzione per la personalizzazione, mentre setq è più simile a un'associazione let in linguaggi di programmazione funzionale (con regola di scoping dinamica / lessicale a seconda della modalità di scoping globale attiva. .......)
setq
imposta un valore var, indipendentemente dal fatto che var (occorrenza) sia locale. defvar
dichiara una var come globale. (Può anche essere "buffer-local":. local-variable-p
) Una ricorrenza var associata come una funzione arg o by let
è "local" nel senso comune. Se un var associato da let
etc è globale (o buffer-local), viene creato un binding locale (senso comune) per esso, per la durata / ambito di ciò let
. All'interno di tale ambito vincolante, setq
cambia il valore locale. È meglio parlare di un'occorrenza var locale (in pila) o globale (in pila) piuttosto che in una var.
M-x report-emacs-bug
suggerire miglioramenti che potrebbero aiutare gli altri a semplificarlo.