¿Cuál es la diferencia entre setq
y defvar
en 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 setq
y defvar
en 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 i
elija 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 defvar
permite 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 defvar
sin 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.
defvar
y setq
son similares, pero no iguales, en Emacs Lisp y Common Lisp.
defvar
es 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). .......)
setq
establece un valor var, independientemente de si var (ocurrencia) es local. defvar
declara una var como global. (También puede ser "buffer-local":. local-variable-p
) Una ocurrencia var enlazada como una función arg o by let
es "local" en el sentido habitual. Si una var unida por let
etc. 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, setq
cambia 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-bug
sugerirle mejoras que podrían ayudar a otros a hacerlo más fácil.