Emacs Lisp:评估列表中的变量

时间:2009-11-02 22:42:42

标签: elisp

这可能很愚蠢,但我没有足够的Elisp知识来了解引用和评估方面的情况。

假设我有这个Elisp代码:

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

它将产生预期的default-frame-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))

并且,从框架几何图形来看,永远不会评估这些变量。如何在此列表中显示my-frame-width和height的实际值?我的报价太多了吗?但我无法从添加到列表的评估中删除任何内容......

2 个答案:

答案 0 :(得分:34)

试试这个:

(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参考手册,然后在其中搜索反引号。

答案 1 :(得分:13)

作为mch答案中反引号运算符的替代方法,您可以使用cons函数。此函数将构建一个cons单元,第一个参数作为其car,第二个参数作为其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))

这样,您可以引用想要按字面意思显示的符号(如宽度和高度),并评估所需值的符号(如my-frame-width和my-frame-height)。我更喜欢这种方法,因为它更直接。但是,这肯定是一个意见问题。这里还有一些information on cons and list供将来参考。