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.