2015-06-26 2 views
0

я установил некоторую тему и поместите в моем $HOME/.emacs:Embedded `(цитата ...)`

(custom-set-variables ; Your init file should only contain one of these 
'(custom-safe-themes (quote ("ea489f6710a3da0738e7dbdfc124df06a4e3ae82f191ce66c2af3e0a15e99b90" 
           "a8245b7cc985a0610d71f9852e9f2767ad1b852c2bdea6f4aadc12cce9c4d6d0" 
           "8aebf25556399b58091e533e455dd50a6a9cba958cc4ebb0aab175863c25b9a4" 
           default))) 
) 

Почему это цитата внутри цитаты? Разве это не избыточно?

+2

Потому что он оценивает значение, и он хочет, чтобы его обрабатывали буквально, когда это происходит. – Barmar

+0

@Barmar Я попытался удалить '(quote' и соответствующий паз, и он все еще работает. Не знаю, – Czipperz

+1

emacs.stackexchange.com может быть лучше, чтобы спросить об этом. Это не совсем о программировании вообще, а о как Emacs обрабатывает параметры настройки. – Barmar

ответ

4

Почему у него есть цитата внутри цитаты? Разве это не избыточно?

Это не избыточно, потому что оно дает другое значение; общий случай в Lisp равен (quote foo) => foo, тогда как (quote (quote foo)) => (quote foo). Таким образом, цитирование и двойное цитирование не являются взаимозаменяемыми: один из них правильный, а другой - нет.

В этом конкретном случае существует несколько уровней оценки, поэтому необходимы несколько уровней цитирования. Внешняя цитата защищает от нормальной оценки аргументов перед вызовами функций, так что custom-set-variables получает список (custom-safe-themes (quote ("ea489..." ... default)))).

В конечном итоге он переходит к custom-theme-set-variables, который вызывает eval по второму элементу списка (quote ("ea489..." ... default)).

Я попытался удалить (quote и соответствующий парн, и он все еще работает.

Это кажется работать, но это только потому, что пользовательские функции настройки поймать ошибку. Если вы проверите *Messages*, вы увидите Error setting custom-safe-themes: (invalid-function ea489f6710a3da0738e7dbdfc124df06a4e3ae82f191ce66c2af3e0a15e99b90).

+0

Делает ли запись '' ("ea489 ...' работает так же, как '(quote (" ea489 ... '? – Czipperz

+1

Yup,' 'foo' идентичен' (quote foo) ', всегда. – npostavs

Смежные вопросы