Emacs Lisp: оценивать переменную в alist

Это, вероятно, глупо, но у меня недостаточно знаний об Elisp, чтобы понять, что происходит в отношении цитирования и оценки.

Предположим, у меня есть этот код Elisp:

(add-to-list 'default-frame-alist '(width . 100))
(add-to-list 'default-frame-alist '(height . 50))

Это приведет к ожидаемому значению default-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-width и height отображались в этом списке? У меня слишком много цитат? Но я не могу удалить какие-либо из оценок добавления в список...

2 ответа

Решение

Попробуй это:

(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))

Использование обратной кавычки вместо кавычек позволяет использовать, чтобы форсировать оценку параметра.

См. Справочное руководство Elisp. Введите Cx info, найдите справочное руководство elisp, а затем найдите в нем обратную цитату.

В качестве альтернативы оператору mch ответе 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))

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

Другие вопросы по тегам