2009-11-02 16 views
22

To jest prawdopodobnie głupie, ale nie mam wystarczającej wiedzy Elisp, aby zrozumieć, co się dzieje w odniesieniu do cytowania i oceny.Emacs Lisp: ocena zmiennej w alist

Załóżmy, że mam ten kod Elisp:

(add-to-list 'default-frame-alist '(width . 100)) 
(add-to-list 'default-frame-alist '(height . 50)) 

Spowoduje to oczekiwanej wartości domyślnych ramki ALIST:

((height 50) 
(width 100)) 

Ale teraz, gdy mam to:

(setq my-frame-width 100) 
(setq my-frame-height 50) 
(add-to-list 'default-frame-alist '(width . my-frame-width)) 
(add-to-list 'default-frame-alist '(height . my-frame-height)) 

Spowoduje to -

((height my-frame-height) 
(width my-frame-width)) 

i, sądząc z geometrii ramki, nigdy nie ocenia tych zmiennych. Jak wyświetlić rzeczywiste wartości szerokości i wysokości mojej ramki w tym zestawieniu? Czy mam zbyt wiele ofert? Ale nie mogę usunąć dowolny z add-to-liście ocenach ...

Odpowiedz

28

Spróbuj tego:

(setq my-frame-width 100) 
(setq my-frame-height 50) 
(add-to-list 'default-frame-alist `(width . ,my-frame-width)) 
(add-to-list 'default-frame-alist `(height . ,my-frame-height)) 

Korzystanie backquote zamiast cytatem pozwala używać, aby wymusić ocenę parametru.

Patrz instrukcja obsługi Elisp. Wpisz info C-x, wyszukaj podręcznik podręcznika dla elipsów, a następnie wyszukaj hasło wewnętrzne w tym temacie.

+0

Dokładnie tego, czego szukałem, dzięki! Takie pytania przypominają mi, że powinienem poświęcić czas na systematyczną naukę elisu. –

+0

Zobacz także [Emacs LISP ocenia zmienną w tym samym miejscu] (http://stackoverflow.com/questions/15485833/emacs-lisp-evaluate-variable-in-alist) dla podobnego problemu. –

+3

Uwielbiam intuicyjną oczywistość rzecz z wycinkami i przecinkami. – Cheeso

11

Jako alternatywę dla operatora wstecznego w odpowiedzi mch można użyć funkcji cons. Ta funkcja zbuduje komórkę cons z pierwszym argumentem jako samochodem i drugim argumentem jako cdr. Zapis kropkowanej pary w twoim kodzie jest skrótem. Więc możemy przepisać kod ten sposób:

(setq my-frame-width 100) 
(setq my-frame-height 50) 
(add-to-list 'default-frame-alist (cons 'width my-frame-width)) 
(add-to-list 'default-frame-alist (cons 'height my-frame-height)) 

W ten sposób, można zacytować symbole, które mają pojawiać dosłownie (jak szerokość i wysokość) i oceny symboli, których wartości trzeba (jak mój-Frame-width i wysokość mojej klatki). Wolę tę metodę, ponieważ jest bardziej prosta. Jest to jednak z pewnością kwestia opinii. Oto trochę więcej information on cons and list do wykorzystania w przyszłości.

Powiązane problemy