Nie jestem całkiem pewien na temat wszystkich odmian zmiennych lokalnych buforów, nawet po przeczytaniu wszystkich dokumentów i kilku postów tutaj na SX.
Oto podsumowanie mojego zrozumienia:
(defvar foo ..)
deklaruje zmienną dynamiczną dla pliku. Ale zmienna (1) nie jest znana innym plikom, chyba że zawierają one również defvar
instrukcję, oraz (2) zmienna ma zasięg globalny, a nie bufor lokalny.
(make-variable-buffer-local foo)
po defvar
powyższym informuje kompilator i wszystkich innych, że zmienna foo ma być traktowana jako bufor lokalna wszędzie tam, gdzie jest ustawiona, kiedy jest ustawiona. Ten wzorzec jest dobrym stylem do deklarowania zmiennej lokalnej bufora, umieszczając obie instrukcje w pliku z powrotem.
(defvar xxx ...) ;declare xxx with global scope
(make-variable-buffer-local 'xxx) ;but now make it buffer-local everywhere
Dla wygody (defvar-local xxx ...)
formularz można wykorzystać jako jedną linię zamiast dwóch linii powyżej:
(defvar-local xxx ...) ;make xxx buffer local everywhere
Po zadeklarowaniu jak powyżej zmienna xxx może być używana jak każda inna zmienna w instrukcjach setq.
Jeśli chcę mieć tylko jedną instancję zmiennej lokalnej bufora, która jest już globalną zmienną dynamiczną, użyłbym następujących deklaracji. Pierwsza deklaruje zmienną dynamiczną o zasięgu globalnym, a druga instrukcja tworzy tylko jedną instancję lokalnej wersji tej zmiennej w buforze:
(defvar xxx ...) ;declare xxx with global scope
(make-local-variable 'xxx) ;make xxx local in this buffer only
Teraz moje pytania wyjaśniające (wszystkie powyższe były dorozumianymi pytaniami, czy moje rozumienie jest prawidłowe).
Podczas ustawiania wartości zmiennych mogę użyć setq
lub
setq-local
. Kiedy należy setq-local
stosować? Dlaczego?
Co się stanie, jeśli korzystam setq-local
z lokalnych zmiennych buforujących lub zmiennych lokalnych buforujących?
Czy setq-local
wymagana jest defvar-local
deklarowana zmienna?
Czy setq-local
normalna defvar
deklarowana zmienna zmieni ją w zmienną lokalną w buforze? (Innymi słowy, czy w setq-local
jakiś sposób jest to odpowiednik (make-variable-local xxx)
deklaracji?
(setq-local VAR VALUE)
jest po prostu skrótem (set (make-local-variable VAR) VALUE)
, który był (i nadal jest) powszechnym idiomem.