¿Cuál es la diferencia entre setq y defvar

14

¿Cuál es la diferencia entre setqy defvaren Emacs lisp?

Veo la versión común de lisp de la misma pregunta en /programming/3855862 . ¿Son iguales en Elisp?

Yasushi Shoji
fuente

Respuestas:

18

Debe hacerle esta pregunta a Emacs : C-h ielija el manual de Elisp ( m Elisp) y busque en el índice "defvar" ( i defvar). Eso te lleva al nodo Definir variables .

Emacs le dice que defvarpermite adjuntar una cadena de documentos y que si la variable ya tiene un valor, entonces no hace nada .

También le informa sobre el uso de defvarsin valor que se asignará: (defvar foo). Le dice que eso declara que la variable tiene un alcance dinámico .

setq no tiene ninguna de esas propiedades.

defvary setqson similares, pero no iguales, en Emacs Lisp y Common Lisp.

Leer más, para aprender más.

Dibujó
fuente
1
De hecho, defvar también declara "alcance dinámico" si hay un valor dado, y eso sigue siendo cierto incluso si la variable ya tenía un valor. OTOH "si la variable ya tiene un valor, entonces no hace nada" es cierto para todos los usos válidos de defvar (y el compilador de bytes debe emitir una advertencia en los casos restantes, es decir, si declara una variable después de su primer uso).
YoungFrog
Por lo tanto, parece que defvares una variable global (como en el estilo de programación imperativo) y una convención para la personalización, mientras que setq es más como un enlace let en lenguajes de programación funcionales (con una regla de alcance dinámica / léxica dependiendo de qué modo de alcance global esté activo). .......)
nicolas
@nicolas: Por favor lea el manual. setqestablece un valor var, independientemente de si var (ocurrencia) es local. defvardeclara una var como global. (También puede ser "buffer-local":. local-variable-p) Una ocurrencia var enlazada como una función arg o by letes "local" en el sentido habitual. Si una var unida por letetc. es global (o local en el búfer), entonces se crea un enlace local (sentido habitual) para la duración / alcance de eso let. Dentro de ese alcance vinculante, setqcambia el valor local. Es mejor hablar de que una ocurrencia var es local (en la pila) o global (en el montón) que una var es así.
Dibujó el
1
@nicolas: Tómese su tiempo para leerlo y releerlo. A veces lo que dice es preciso pero difícil de entender, como una especificación formal. Una vez que lo obtenga, podría ser útil M-x report-emacs-bugsugerirle mejoras que podrían ayudar a otros a hacerlo más fácil.
Dibujó el
1
@nicolas: Comience por comprender una variable en el montón (también conocida como una variable global o local de búfer). Probablemente ya comprenda las verdaderas variables locales, es decir, las variables en la pila . Buscar en Google también podría ayudar.
Dibujó el