¿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?
¿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?
Respuestas:
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.
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). .......)
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í.
M-x report-emacs-bugsugerirle mejoras que podrían ayudar a otros a hacerlo más fácil.