Jaka jest różnica między setq a defvar

14

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?

Yasushi Shoji
źródło

Odpowiedzi:

18

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.

Czytaj więcej, aby dowiedzieć się więcej.

Rysował
źródło
1
W rzeczywistości defvar deklaruje również „dynamiczne określanie zakresu”, jeśli podana jest wartość, i pozostaje to prawdą, nawet jeśli zmienna ma już wartość. OTOH „jeśli zmienna ma już wartość, to nic nie robi” jest prawdziwa dla wszystkich prawidłowych zastosowań defvar (a bytecompiler powinien wydać ostrzeżenie w pozostałych przypadkach, tj. Jeśli deklaruje zmienną po pierwszym użyciu).
YoungFrog,
więc wygląda na to, że 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. .......)
Nicolas
@nicolas: Przeczytaj instrukcję. 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.
Drew
1
@nicolas: Nie spiesz się z czytaniem i ponownym czytaniem. Czasami to, co mówi, jest precyzyjne, ale trudne do zrozumienia, jak formalna specyfikacja. Gdy go zdobędziesz, możesz M-x report-emacs-bugzaproponować ulepszenia, które mogą pomóc innym.
Drew
1
@nicolas: Zacznij od zrozumienia zmiennej na stercie ( zwanej także zmienną globalną lub lokalną dla bufora). Prawdopodobnie już znasz prawdziwe zmienne lokalne, czyli zmienne na stosie . Google może również pomóc.
Drew