2009-11-02 77 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供将来参考。