Как использовать имена переменных внутри литералов в Emacs Lisp?

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

Например:

(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 здесь? Я, конечно, могу обойти это, но я хотел бы понять, что происходит.


person auramo    schedule 21.01.2012    source источник


Ответы (2)


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

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

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

(setq inner ["d" "e"])
(vector "a" "b" inner)
=> ["a" "b" ["d" "e"]]
person Lindydancer    schedule 21.01.2012

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

(setq inner ["d" "e"])
`["a" "b" ,inner]
=> ["a" "b" ["d" "e"]]
person d5884    schedule 21.01.2012