Qual é a diferença entre setq
e defvar
no Emacs lisp?
Vejo a versão lisp comum da mesma pergunta em /programming/3855862 . Eles são iguais em Elisp?
Qual é a diferença entre setq
e defvar
no Emacs lisp?
Vejo a versão lisp comum da mesma pergunta em /programming/3855862 . Eles são iguais em Elisp?
Respostas:
Você deve fazer esta pergunta ao Emacs :, C-h i
escolha o manual Elisp ( m Elisp
) e pesquise no índice "defvar" ( i defvar
). Isso leva você ao nó Definindo variáveis .
O Emacs diz que defvar
permite anexar uma sequência de documentos e que, se a variável já tiver um valor, ela não fará nada .
Ele também informa sobre o uso de defvar
sem valor a ser atribuído: (defvar foo)
. Ele diz que isso declara que a variável tem escopo dinâmico .
setq
não possui nenhuma dessas propriedades.
defvar
e setq
são semelhantes, mas não exatamente iguais, no Emacs Lisp e no Common Lisp.
defvar
uma variável global (como no estilo de programação imperativa) e uma convenção para personalização, enquanto setq é mais como uma ligação let em linguagens de programação funcionais (com regra de escopo dinâmico / lexical, dependendo de qual modo de escopo global está ativo .. .......)
setq
define um valor var, independentemente de a var (ocorrência) ser local. defvar
declara um var como global. (Também pode ser "buffer-local":. local-variable-p
) Uma ocorrência var vinculada como uma função arg ou by let
é "local" no sentido usual. Se um var vinculado por let
etc. for global (ou local de buffer), será criada uma ligação local (sentido usual) para ele, pela duração / escopo disso let
. Dentro desse escopo de ligação, setq
altera o valor local. É melhor falar sobre uma ocorrência var ser local (na pilha) ou global (na pilha) do que uma var ser.
M-x report-emacs-bug
sugerir melhorias que possam ajudar outras pessoas a facilitar.