Jaka jest różnica pomiędzy setq
i defvar
w seplenie Emacsa?
Widzę wspólną wersję lisp tego samego pytania na /programming/3855862 . Czy są takie same w Elisp?
Jaka jest różnica pomiędzy setq
i defvar
w seplenie Emacsa?
Widzę wspólną wersję lisp tego samego pytania na /programming/3855862 . Czy są takie same w Elisp?
Odpowiedzi:
Powinieneś zadaćC-h i
Emacsowi następujące pytanie: wybierz instrukcję Elisp ( m Elisp
) i wyszukaj w indeksie „defvar” ( i defvar
). To prowadzi do węzła Definiowanie zmiennych .
Emacs mówi ci, że defvar
pozwala na dołączenie łańcucha dokumentów i że jeśli zmienna ma już wartość, to nic nie robi .
Informuje także o wykorzystaniu defvar
bez wartości, aby przypisać: (defvar foo)
. Mówi ci, że deklaruje, że zmienna ma zasięg dynamiczny .
setq
nie ma żadnej z tych właściwości.
defvar
i setq
są podobne, ale nie do końca takie same, w Emacs Lisp i Common Lisp.
defvar
jest zmienną globalną (jak w imperatywnym stylu programowania) i konwencją dostosowywania, podczas gdy setq bardziej przypomina wiązanie let w funkcjonalnych językach programowania (z dynamiczną / leksykalną regułą zakresu w zależności od tego, który aktywny jest tryb globalnego zakresu. .......)
setq
ustawia wartość var, niezależnie od tego, czy var (wystąpienie) jest lokalne. defvar
deklaruje var jako globalny. (Może to być również „bufor lokalny” local-variable-p
:.) Wystąpienie zmiennej ograniczone jako funkcja arg lub przez let
jest „lokalne” w zwykłym znaczeniu. Jeśli zmienna var powiązana przez let
itp. Jest globalna (lub lokalna w buforze), wówczas tworzone jest dla niej powiązanie lokalne (zwykle) na czas trwania / zakres tego let
. W tym wiążącym zakresie setq
zmienia wartość lokalną. Lepiej jest mówić o tym, że wystąpienie var jest lokalne (na stosie) lub globalne (na stosie) niż var.
M-x report-emacs-bug
zaproponować ulepszenia, które mogą pomóc innym.