Как использовать имена переменных внутри литералов в Emacs Lisp? - PullRequest
6 голосов
/ 21 января 2012

Можно ли написать, например, литерал Vector, который использует переменную внутри, чтобы переменная вычислялась правильно, и результирующий вектор не просто содержал имя / символ переменной?

Например:

(setq inner ["d" "e"])
["a" "b" inner]

Результаты в:

["a" "b" inner]

Но я бы хотел получить:

["a" "b" ["d" "e"]]

Я делал некоторое кодирование Clojure до Elisp, там все работает, как я и ожидал:

(def inner ["d" "e"])
user=> ["a" "b" inner]             
["a" "b" ["d" "e"]]

Что здесь фундаментального, чего я не понимаю в Elisp?Конечно, я могу обойти это, но я бы хотел понять, что происходит.

Ответы [ 2 ]

13 голосов
/ 21 января 2012

При использовании векторного синтаксиса элементы считаются постоянными. Из Справочного руководства по Emacs Lisp 6.4:

Вектор, такой как строка или число, считается константой для оценка: результатом оценки является один и тот же вектор. Это делает не оценивать или даже исследовать элементы вектора.

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

(setq inner ["d" "e"])
(vector "a" "b" inner)
=> ["a" "b" ["d" "e"]]
8 голосов
/ 21 января 2012

использовать литерал обратной цитаты.Можно использовать как для списка.

(setq inner ["d" "e"])
`["a" "b" ,inner]
=> ["a" "b" ["d" "e"]]
...