2009-11-02 76 views
22

這可能很愚蠢,但我沒有足夠的Elisp知識來理解關於引用和評估的內容。Emacs Lisp:在alist中評估變量

假設我有這樣的elisp代碼:

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

這將導致預期的默認幀ALIST值:

((height 50) 
(width 100)) 

但現在,如果我有這樣的:

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

這將導致 -

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

並且從框架幾何判斷,從不評估這些變量。我如何讓這個alist中出現my-frame-width和height的實際值?我有太多報價嗎?但我不能從添加到列表評估刪除任何...

回答

28

試試這個:

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

使用反引號,而不是引用允許你使用,強制參數的評估。

請參閱Elisp參考手冊。鍵入C-x信息,搜索elisp參考手冊,然後在其中搜索反引用。

+0

正是我在找的,謝謝!像這樣的問題提醒我,我應該花時間系統地學習elisp。 – 2009-11-02 23:09:16

+0

另請參見[Emacs lisp評估變量在alist](http://stackoverflow.com/questions/15485833/emacs-lisp-evaluate-variable-in-alist)爲一個類似的問題。 – 2013-03-18 20:53:12

+3

我愛直觀的顯而易見的反引號和逗號的東西。 – Cheeso 2013-06-05 00:08:29

11

作爲mch的答案中反引號運算符的替代方法,可以使用cons函數。這個函數將建立一個帶有第一個參數的cons單元作爲它的汽車,第二個參數作爲它的cdr。代碼中的虛線對錶示法是對此的簡寫。因此,我們可以這樣重寫代碼:

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

這樣,您就可以給你想要的字面(如寬度和高度)出現的符號和評估其價值,你需要(像我的幀寬度符號和我的框架高度)。我更喜歡這種方法,因爲它更直接。但是,這當然是一個意見問題。這裏有更多的information on cons and list供將來參考。