Qual è la differenza tra setq e defvar


Risposte:


18

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.

Leggi di più, per saperne di più.


1
In effetti defvar dichiara anche "scoping dinamico" se c'è un valore dato, e questo rimane vero anche se la variabile aveva già un valore. OTOH "se la variabile ha già un valore, allora non fa nulla" è vero per tutti gli usi validi di defvar (e il compilatore bytec dovrebbe emettere un avviso nei casi rimanenti, ovvero se dichiarare una variabile dopo il suo primo utilizzo).
YoungFrog,

quindi sembra che 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. .......)
nicolas,

@nicolas: leggi il manuale. 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.
Estratto il

1
@nicolas: prenditi il ​​tuo tempo leggendolo e rileggendolo. A volte ciò che dice è preciso ma difficile da comprendere, come una specifica formale. Una volta ottenuto, potrebbe essere utile M-x report-emacs-bugsuggerire miglioramenti che potrebbero aiutare gli altri a semplificarlo.
Estratto il

1
@nicolas: Iniziare con la comprensione di una variabile del mucchio (aka una globali o variabili buffer locale). Probabilmente hai già capito le vere variabili locali, ovvero le variabili nello stack . Anche Google può aiutare.
Estratto il
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.