2011-05-21 9 views
14

¿Qué significa la diferencia entre var y quote en Clojure? Por ejemplo, (var a) y (quote a).¿Cuál es la diferencia entre var y quote?

El sitio oficial tiene los documentos siguientes, pero ¿cuál es la diferencia entre el objeto var y el valor del símbolo? Estoy confundido.

(símbolo var) El símbolo debe resolver a un var, y el propio (no su valor) objeto Var se devuelve

+1

Considere la posibilidad de agregar en la definición de 'quote' también. Debería tener sentido. –

Respuesta

17

(quote a) devuelve un símbolo (clojure.lang.Symbol) - efectivamente hace lo mismo que 'a. Vale la pena leer un poco más sobre Clojure reader para obtener más información sobre los símbolos. Ejemplo:

(quote a) 
=> a 

(var a) devuelve el var (clojure.lang.Var) representado por el símbolo A en el espacio de nombres actual. Obtendrá un error si a no está definido en el espacio de nombres actual. Ejemplo:

(var a) 
=> #<CompilerException java.lang.RuntimeException: Unable to resolve var: a in this context, compiling:(NO_SOURCE_PATH:1)> 

(def a 1) 
(var a) 
=> #'user/a 

Esa es la definición técnica - pero aquí está la intuición detrás de él: un símbolo es un nombre, que puede ser utilizado para buscar una var en un espacio de nombres dado. Una var es un tipo de referencia que puede contener cualquier tipo de valor de Clojure. Entonces, un símbolo identifica una var que contiene un valor.

4

Considera:

; #'x a reader short-cut for (var x), and 'x is a short-cut for (quote x) 
(def x) 
(binding [x 1] (var-set #'x 2) (list (var x) (quote x) x)) 

que evalúa a algo así como (comentarios añade)

(
#'sandbox177857/x ; the variable itself - was passed to var-set 
x     ; the symbol x. same as 'x 
2     ; last value in #'x 
) 

set! tendrá en (entre otras cosas) un revendedor o un símbolo que se resuelve en un nombre global (var-set solo aceptará un Var). La razón por la que (var-set x ...) no hubiera funcionado es que esto habría dado como resultado que se transfiriera el valor de x (y no el Var llamado x).

Espero que esto haya ayudado. Feliz codificación.

+0

Gracias por la respuesta. Parece que el objeto Var es una capa inmediata entre el nombre del símbolo y su valor, ¿es así? – Thomson

+0

@Thomson Es una forma de "hablar" de una variable con un nombre de pila. En C esto no es necesario: 'x = x + 1;' La primera x es un valor l y no se evalúa. Por lo tanto, Vars en Clojure puede ser más poderoso porque se pueden transmitir como valores en sí mismos; C requeriría diversión con el puntero. Además, como un Var está separado del nombre en el alcance, se puede pasar a través de diferentes ámbitos léxicos que podrían tener su propia variable "x", pero el Var siempre es él mismo. –

+0

Además, no puedo ejecutar su programa de muestra directamente para verificar el resultado. Obtuve "CompilerException System.Exception: no se puede resolver var: x en este contexto". Pero si agrego un (def x 3) antes de la muestra, también genera una excepción. – Thomson

Cuestiones relacionadas