2012-03-14 4 views
6

Ho usato il codice come questo:Come costruire lista con defvar in emacs

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

Poi M-xeval-region. Ho ottenuto "1", "2", my-defvar in minibuffer.

La mia domanda è come convertire my-defvar in una lista.

risposta

12

In Lisp, lo ´ -symbol sarà quota il resto dell'espressione. Ciò significa che il valore sarà l'espressione esattamente come è scritto, le chiamate di funzione non vengono valutate, le variabili non vengono sostituite con il valore ecc.

Il modo più diretto è utilizzare la funzione list che crea un elenco di elementi, dopo la valutazione è argomenti, ad esempio:

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

Naturalmente, si potrebbe anche usare il backquote sintassi , come suggerito in un'altra risposta. Ciò consente di quotare un'espressione complessa ma unquote (vale a dire valutare) parti di esso. Tuttavia, in questo semplice caso, non penso che sia lo strumento giusto per il lavoro.

+0

Grazie. Funziona. – coordinate

6

my-defvar non viene valutato come variabile, viene interpretato come un simbolo.

Vedere Emacs Lisp: evaluate variable in alist.

Quindi:

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

dovrebbe funzionare.

Aggiornamento: Una soluzione più appropriata è data in @ Lindydancer di answer, ma lascio questo qui come riferimento.

+1

Non viene valutato come * stringa letterale * (poiché le virgolette non vengono utilizzate), viene interpretato come un * simbolo *. – Lindydancer

+0

Ora ho corretto questo, anche se penso che la tua risposta sia più appropriata. – MGwynne