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). Я предпочитаю этот метод, потому что он более прост. Однако это, безусловно, вопрос мнения. Вот еще немного информации о минусах и список для дальнейшего использования.