Как построить список с defvar в Emacs - PullRequest
6 голосов
/ 14 марта 2012

Я использовал такой код:

(defvar my-defvar "test")
(completing-read "input: " '("1" "2" my-defvar))

Тогда М-х eval-region. Я получил «1», «2», my-defvar в минибуфере.

У меня вопрос, как преобразовать my-defvar в строку в списке.

Ответы [ 2 ]

12 голосов
/ 14 марта 2012

В Лиспе символ ´ будет заключать в кавычки остальную часть выражения. Это означает, что значение будет выражением в точности так, как оно написано, вызовы функций не оцениваются, переменные не заменяются его значением и т. Д.

Самый простой способ - использовать функцию list, которая создает список элементов после оценки его аргументов, например:

(completing-read "input: " (list "1" "2" my-defvar))

Конечно, вы также можете использовать синтаксис backquote , как предложено в другом ответе. Это позволяет вам заключать в сложное выражение, но заключать в кавычки (то есть оценивать) его части. Однако в этом простом случае я не думаю, что это правильный инструмент для работы.

6 голосов
/ 14 марта 2012

my-defvar не оценивается как переменная, а интерпретируется как символ.

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

Итак:

(defvar my-defvar "test")
(completing-read "input: " `("1" "2" ,my-defvar))

должно работать.

Обновление: Более подходящее решение дано в @ 1015 * answer @ Lindydancer, но я оставляю это здесь для справки.

...