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?
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?
Respostas:
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.
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 .. .......)
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.
M-x report-emacs-bugsugerir melhorias que possam ajudar outras pessoas a facilitar.