Qual'è la differenza tra setqe defvarin Emacs lisp?
Vedo la versione lisp comune della stessa domanda su /programming/3855862 . Sono gli stessi in Elisp?
Qual'è la differenza tra setqe defvarin 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 iscegli il manuale Elisp ( m Elisp) e cerca "defvar" nell'indice i defvar. Questo ti porta al nodo Definizione delle variabili .
Emacs ti dice che defvarconsente 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 defvarsenza valore da assegnare: (defvar foo). Ti dice che ciò dichiara che la variabile ha un ambito dinamico .
setq non ha nessuna di quelle proprietà.
defvare setqsono simili, ma non uguali, in Emacs Lisp e Common Lisp.
defvarsia 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. .......)
setqimposta un valore var, indipendentemente dal fatto che var (occorrenza) sia locale. defvardichiara 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 letetc è 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, setqcambia 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-bugsuggerire miglioramenti che potrebbero aiutare gli altri a semplificarlo.