Почему у него есть цитата внутри цитаты? Разве это не избыточно?
Это не избыточно, потому что оно дает другое значение; общий случай в 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)
.
Потому что он оценивает значение, и он хочет, чтобы его обрабатывали буквально, когда это происходит. – Barmar
@Barmar Я попытался удалить '(quote' и соответствующий паз, и он все еще работает. Не знаю, – Czipperz
emacs.stackexchange.com может быть лучше, чтобы спросить об этом. Это не совсем о программировании вообще, а о как Emacs обрабатывает параметры настройки. – Barmar