Jaka jest różnica pomiędzy setqi defvarw 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 setqi defvarw 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 defvarpozwala na dołączenie łańcucha dokumentów i że jeśli zmienna ma już wartość, to nic nie robi .
Informuje także o wykorzystaniu defvarbez 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.
defvari setqsą podobne, ale nie do końca takie same, w Emacs Lisp i Common Lisp.
defvarjest 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. .......)
setqustawia wartość var, niezależnie od tego, czy var (wystąpienie) jest lokalne. defvardeklaruje var jako globalny. (Może to być również „bufor lokalny” local-variable-p:.) Wystąpienie zmiennej ograniczone jako funkcja arg lub przez letjest „lokalne” w zwykłym znaczeniu. Jeśli zmienna var powiązana przez letitp. 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 setqzmienia 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-bugzaproponować ulepszenia, które mogą pomóc innym.