2012-03-14 7 views
6

que utiliza un código como éste:Cómo construir la lista con defvar en emacs

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

Entonces M-xeval-region. llegué "1", "2", my-defvar en minibuffer.

Mi pregunta es cómo convertir a my-defvar cadena en una lista.

Respuesta

12

En Lisp, el ´ -símbolo será citar el resto de la expresión. Esto significa que el valor será la expresión exactamente como está escrito, las llamadas a funciones no se evalúan, las variables no se reemplazan por su valor, etc.

La forma más directa es usar la función list que crea una lista de elementos, después de evaluar sus argumentos, por ejemplo:

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

por supuesto, también se puede utilizar la sintaxis backquote, como se sugiere en otra respuesta. Esto le permite citar una expresión compleja, pero fin de la cita (es decir, evaluar) partes de ella. Sin embargo, en este caso simple, no creo que sea la herramienta adecuada para el trabajo.

+0

Gracias. Funciona. – coordinate

6

my-defvar no está siendo evaluado como una variable, que está siendo interpretado como un símbolo.

Ver Emacs Lisp: evaluate variable in alist.

Así:

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

debería funcionar.

Actualización: Una solución más adecuada se da en @ Lindydancer's answer, pero lo dejo aquí como referencia.

+1

no está siendo evaluado como un literal * * cadena (que no se utilizan comillas), en lugar que está siendo interpretado como un símbolo * *. – Lindydancer

+0

Ahora he corregido esto, aunque creo que su respuesta es más apropiada. – MGwynne

Cuestiones relacionadas