为什么在setq()时LISP中没有引发关于未定义变量的错误?

时间:2011-11-17 05:28:06

标签: emacs lisp

在我的Emacs配置中,我有一个字符串:

(setq ibuffer-saved-filter-groups
  (quote (("default"
           ("dired"
            (mode . dired-mode))
           ("System"
            (or (name . "\*scratch\*")
                (name . "\*Messages\*")))
           ("SVN"
            (name . "^\\*vc-.*\\*$"))))))

变量namemode未定义,但代码已正确评估。当我尝试自己制作这样的东西时:

(some-var . "some-value")

我收到有关未定义变量some-var的错误。

3 个答案:

答案 0 :(得分:7)

当引用基准时,不评估任何内容。例如:

foo

计算绑定到标识符foo的值,而

'foo

(quote foo)

评估为符号foo

同样地,

(+ 1 2 3)

评估为6,而

'(+ 1 2 3)

(quote (+ 1 2 3))

评估到包含四个元素的列表:符号+,以及数字1,2和3.特别是,+未被评估。

同样,您的namemode都在引用的基准范围内,不会被视为标识符,而是视为符号。他们没有被评估。

答案 1 :(得分:1)

我觉得这样,因为名字和模式都在(引用)

答案 2 :(得分:0)

查看C-h v ibuffer-saved-filter-groups。它进一步解释了这些变量。这是一个alist变量。根据文件,它应该看起来像((“STRING”QUALIFIERS)(“STRING”QUALIFIERS)...)现在QUALIFIERS是一个与`ibuffer-filtering-qualifiers'相同形式的列表。这是一个类似(SYMBOL.QUALIFIER)的列表。