2009-11-02 20 views
22

Esto es probablemente una tontería pero no tengo suficiente conocimiento de Elisp para entender lo que está pasando con respecto a las cotizaciones y la evaluación.Emacs Lisp: evaluar la variable en alist

Supongamos que tengo este código Elisp:

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

El resultado será el valor predeterminado-frame-a-lista esperada:

((height 50) 
(width 100)) 

Pero ahora si tengo esto:

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

Esto dará como resultado -

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

y, a juzgar por la geometría del marco, nunca evalúa esas variables. ¿Cómo hago para que los valores reales de my-frame-width-height aparezcan en esta lista? ¿Tengo demasiadas cotizaciones? Pero no puedo eliminar cualquier de las evaluaciones-complemento a la lista ...

Respuesta

28

Prueba esto:

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

El uso de las comillas inversas en lugar de la cita le permite utilizar, para forzar la evaluación de un parámetro.

Consulte el manual de referencia de Elisp. Escriba C-x info, busque el manual de referencia de elisp y luego busque la comilla inversa dentro de eso.

+0

¡Exactamente lo que estaba buscando, gracias! Preguntas como esta me recuerdan que debería tomarme el tiempo para aprender elisp sistemáticamente. –

+0

Ver también [Emacs lisp evaluar la variable en alista] (http://stackoverflow.com/questions/15485833/emacs-lisp-evaluate-variable-in-alist) para un problema similar. –

+3

Me encanta la obviedad intuitiva de la cosa de comillas y comillas. – Cheeso

11

Como alternativa al operador de la contraportada en la respuesta mch, puede usar la función cons. Esta función construirá una celda de cons con el primer argumento como su auto y el segundo argumento como su cdr. La notación de par punteado en su código es una abreviatura de esto. Para que pudiéramos volver a escribir el código de la siguiente manera:

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

De esta manera, se puede citar los símbolos que desea que aparezcan literalmente (como la anchura y altura) y evaluar los símbolos cuyos valores que necesita (como mi marco de ancho y my-frame-height). Prefiero este método porque es más directo. Sin embargo, eso es ciertamente una cuestión de opinión. Aquí hay algunos más information on cons and list para referencia futura.