Почему не возникает ошибка о неопределенной переменной в LISP во время setq ()? - PullRequest
2 голосов
/ 17 ноября 2011

В моем конфиге Emacs у меня есть такая строка:

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

Переменные name и mode не определены, но код оценивается правильно. Когда я пытаюсь сделать такое самостоятельно:

(some-var . "some-value")

Я получаю ошибку о неопределенной переменной some-var.

Ответы [ 3 ]

7 голосов
/ 17 ноября 2011

Когда данные цитируются, ничего внутри не оценивается.Например:

foo

соответствует значению, связанному с идентификатором foo, тогда как

'foo

или

(quote foo)

соответствует символу foo.

Аналогично,

(+ 1 2 3)

оценивает до 6, тогда как

'(+ 1 2 3)

или

(quote (+ 1 2 3))

оценивает список из четырех элементов: символ + и цифры 1, 2 и 3. В частности, + не оценивается.

Аналогично, ваши name и mode, оба находятся в указанныхдатум, рассматриваются не как идентификаторы, а как символы.Они не оцениваются.

1 голос
/ 17 ноября 2011

Похоже, это потому, что имя и режим указаны (цитата)

0 голосов
/ 18 ноября 2011

Посмотрите на Ch v ibuffer-save-filter-groups.Это объясняет об этих переменных дальше.Это переменная alist.Согласно документам, он должен выглядеть следующим образом ((«STRING» QUALIFIERS) («STRING» QUALIFIERS) ...) Теперь QUALIFIERS - это СПИСОК той же формы, что и `ibuffer-filtering-qualifiers '.Это как СПИСОК (СИМВОЛ. КВАЛИФЕР).

...