2009-11-02 15 views
22

Questo è probabilmente sciocco ma non ho abbastanza conoscenza Elisp per capire cosa sta succedendo rispetto alla quotazione e alla valutazione.Emacs Lisp: valuta variabile in alist

Supponiamo che io ho questo codice Elisp:

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

Il risultato sarà il valore di default-frame-alist previsto:

((height 50) 
(width 100)) 

Ma ora se ho questo:

(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)) 

Risulterà -

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

e, a giudicare dalla geometria del telaio, non valuta mai tali variabili. Come faccio a visualizzare i valori effettivi di my-frame-width e height in questo alist? Ho troppe quotazioni? Ma non riesco a rimuovere dalle valutazioni add-to-list ...

risposta

28

Prova questa:

(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)) 

Utilizzando backquote invece di citazione consente di utilizzare, per forzare la valutazione di un parametro.

Vedere il manuale di riferimento Elisp. Digitare informazioni C-x, cercare il manuale di riferimento elisp, quindi cercare il backquote all'interno di esso.

+0

Esattamente quello che stavo cercando, grazie! Domande come questa mi ricordano che dovrei prendere tempo per imparare l'elis sistematicamente. –

+0

Vedere anche [Emacs lisp valutare la variabile in alist] (http://stackoverflow.com/questions/15485833/emacs-lisp-evaluate-variable-in-alist) per un problema simile .. –

+3

Adoro l'ovvietà intuitiva del cosa backquote-e-comma. – Cheeso

11

In alternativa all'operatore di backquote nella risposta mch, è possibile utilizzare la funzione cons. Questa funzione costruirà una cella contro il primo argomento come la sua auto e il secondo argomento come il suo cdr. La notazione della coppia puntata nel codice è una scorciatoia per questo. Così potremmo riscrivere il codice in questo modo:

(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)) 

In questo modo, è possibile citare i simboli che si desidera visualizzare letteralmente (come larghezza e altezza) e valutare i simboli i cui valori è necessario (come il mio-frame-width e my-frame-height). Preferisco questo metodo perché è più diretto. Tuttavia, questa è certamente una questione di opinione. Ecco altre information on cons and list per riferimento futuro.