2012-03-14 11 views
6

użyłem kodu:Jak zbudować listę z defvar w emacs

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

Następnie M-xeval-region. Mam "1", "2", my-defvar w minibuforze.

Moje pytanie brzmi: jak przekonwertować my-defvar na ciąg w liście.

Odpowiedz

12

W Lisp, ´ -symbol będzie cytować resztę wyrażenie. Oznacza to, że wartością będzie wyrażenie dokładnie tak, jak zostało napisane, wywołania funkcji nie są obliczane, zmienne nie są zastępowane wartością itp.

Najprostszym sposobem jest użycie funkcji list, która tworzy listę elementów, po dokonaniu oceny jego argumenty, na przykład:

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

oczywiście, można również użyć backquote składni z , jak zasugerowano w innej odpowiedzi. Pozwala to na cytowanie złożonego wyrażenia, ale nie ma znaczenia, czy jego części są w stanie przetworzyć(tj. Jednak w tym prostym przypadku nie sądzę, że jest to właściwe narzędzie do pracy.

+0

Dzięki. To działa. – coordinate

6

my-defvar nie jest oceniana jako zmienna, jest interpretowana jako symbol.

Zobacz Emacs Lisp: evaluate variable in alist.

Więc:

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

powinno działać.

Aktualizacja: Bardziej odpowiednim rozwiązaniem jest podana w @ Lindydancer na answer, ale zostawię to tutaj jako odniesienie.

+1

Nie jest on oceniany jako * ciąg literowy * (ponieważ cytaty nie są używane), zamiast tego jest interpretowany jako * symbol *. – Lindydancer

+0

Poprawiłem to teraz, chociaż myślę, że twoja odpowiedź jest bardziej odpowiednia. – MGwynne