2009-11-02 5 views
22

Dies ist wahrscheinlich albern, aber ich habe nicht genug Elisp Wissen, um zu verstehen, was in Bezug auf das Zitieren und die Bewertung vorgeht.Emacs Lisp: Variable in Alist bewerten

Angenommen, ich habe diesen Elisp Code:

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

Es liegt in dem erwarteten Ausfall-Frame-alist Wert führen wird:

((height 50) 
(width 100)) 

Aber jetzt, wenn ich diese:

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

Es ergibt sich -

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

und wertet aus der Rahmengeometrie diese Variablen nie aus. Wie mache ich die tatsächlichen Werte von My-Frame-Breite und Höhe in diesem Alist erscheinen? Habe ich zu viele Zitate? Aber ich kann nicht von den Add-to-Listenauswertungen entfernen ...

Antwort

28

Try this:

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

Mit Backquote statt Zitat ermöglicht es Ihnen, verwenden, um die Auswertung eines Parameters zu erzwingen.

Siehe das Elisp-Referenzhandbuch. Geben Sie C-x info ein, suchen Sie nach dem elisp-Referenzhandbuch, und suchen Sie danach nach backquote.

+0

Genau das, was ich gesucht habe, danke! Fragen wie diese erinnern mich daran, dass ich mir Zeit nehmen sollte, elisp systematisch zu lernen. –

+0

Siehe auch [Emacs lisp bewerten Variable in Alist] (http://stackoverflow.com/questions/15485833/emacs-lisp-evaluate-variable-in-ist) für ein ähnliches Problem .. –

+3

Ich liebe die intuitive Offensichtlichkeit der Backquote-und-Komma-Sache. – Cheeso

11

Als Alternative zum Backquote-Operator in mch Antwort können Sie die cons Funktion verwenden. Diese Funktion baut eine Cons-Zelle mit dem ersten Argument als Auto und dem zweiten Argument als cdr auf. Die Notation für gepunktetes Paar in Ihrem Code ist eine Abkürzung dafür. So konnten wir den Code auf diese Weise umschreiben:

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

Auf diese Weise können Sie die Symbole zitieren Sie buchstäblich angezeigt werden sollen (wie Breite und Höhe) und bewerten die Symbole, deren Werte Sie benötigen (wie meine Rahmenbreite und my-frame-height). Ich bevorzuge diese Methode, weil es einfacher ist. Dies ist jedoch sicherlich eine Frage der Meinung. Hier sind einige weitere information on cons and list für zukünftige Referenz.