Qual é a diferença entre setq e defvar

14

Qual é a diferença entre setqe defvarno Emacs lisp?

Vejo a versão lisp comum da mesma pergunta em /programming/3855862 . Eles são iguais em Elisp?

Yasushi Shoji
fonte

Respostas:

18

Você deve fazer esta pergunta ao Emacs :, C-h iescolha o manual Elisp ( m Elisp) e pesquise no índice "defvar" ( i defvar). Isso leva você ao nó Definindo variáveis .

O Emacs diz que defvarpermite 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 defvarsem 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.

defvare setqsão semelhantes, mas não exatamente iguais, no Emacs Lisp e no Common Lisp.

Leia mais para saber mais.

Desenhou
fonte
1
De fato, defvar também declara "escopo dinâmico" se houver um valor fornecido, e isso permanece verdadeiro mesmo se a variável já tiver um valor. OTOH "se a variável já tem um valor, então não faz nada" é verdadeiro para todos os usos válidos do defvar (e o bytecompiler deve emitir um aviso nos casos restantes, ou seja, se declarar uma variável após seu primeiro uso).
YoungFrog
soa como defvaruma 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 .. .......)
nicolas
@nicolas: Por favor, leia o manual. setqdefine um valor var, independentemente de a var (ocorrência) ser local. defvardeclara 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 letetc. 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, setqaltera o valor local. É melhor falar sobre uma ocorrência var ser local (na pilha) ou global (na pilha) do que uma var ser.
Tirou
1
@nicolas: Tome seu tempo lendo e relendo. Às vezes, o que diz é preciso, mas difícil de entender, como uma especificação formal. Depois de obtê-lo, pode ser útil M-x report-emacs-bugsugerir melhorias que possam ajudar outras pessoas a facilitar.
Drew
1
@nicolas: Comece compreendendo uma variável na pilha (também conhecida como variável global ou local de buffer). Você provavelmente já entende as variáveis ​​locais verdadeiras, ou seja, variáveis ​​na pilha . O Google também pode ajudar.
Drew