Emacs Lisp: оценить переменную в alist
Это, наверное, глупо, но у меня недостаточно знаний Elisp, чтобы понять, что происходит в отношении цитирования и оценки.
Предположим, что у меня есть этот код Elisp:
(add-to-list 'default-frame-alist '(width . 100))
(add-to-list 'default-frame-alist '(height . 50))
Это приведет к ожидаемому значению по умолчанию-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 в этом алисте? У меня слишком много цитат? Но я не могу удалить какие-либо из оценок add-to-list...
Ответы
Ответ 1
Попробуйте следующее:
(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))
Использование backquote вместо цитирования позволяет вам использовать, чтобы заставить оценивать параметр.
См. справочное руководство Elisp. Введите C-x информацию, найдите справочное руководство elisp, затем выполните поиск в этом окне.
Ответ 2
Как альтернатива оператору backquote в mch, вы можете использовать функцию cons
. Эта функция построит ячейку cons с первым аргументом в качестве своего автомобиля, а второй аргумент - как 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))
Таким образом, вы можете процитировать символы, которые вы хотите воспроизвести буквально (например, ширина и высота), и оценить символы, значения которых вам нужны (например, ширина моего кадра и высота моего кадра). Я предпочитаю этот метод, потому что он более прямолинейный. Однако это, безусловно, вопрос мнения. Вот еще информация о минусах и списке для справок в будущем.