Подтвердить что ты не робот

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...

4b9b3361

Ответ 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))

Таким образом, вы можете процитировать символы, которые вы хотите воспроизвести буквально (например, ширина и высота), и оценить символы, значения которых вам нужны (например, ширина моего кадра и высота моего кадра). Я предпочитаю этот метод, потому что он более прямолинейный. Однако это, безусловно, вопрос мнения. Вот еще информация о минусах и списке для справок в будущем.