2012-03-18 22 views
20

En clojure, me gustaría saber cuáles son las diferencias entre los tres a continuación.En Clojure, diferencia entre función, función citada y función de cita nítida

(println (map + '(1 2 3) '(4 5 6))) 

(println (map '+ '(1 2 3) '(4 5 6))) 

(println (map #'+ '(1 2 3) '(4 5 6))) 

Los resultados son

(5 7 9) 

(4 5 6) 

(5 7 9) 

No puedo entender el comportamiento de la segunda.

Creo que el primero y el tercero son los mismos en clojure que es Lisp-1 y no distingue entre evaluar una variable y la función con el mismo nombre.

Esto puede ser una pregunta básica, pero parece que no hay suficiente información. Por favor enséñame.

Gracias.

+2

Como nota adicional, en clojure es idiomático describir secuencias literales con vectores en lugar de listas citadas. –

+0

Oh, ya veo. Gracias, Alex. –

Respuesta

32

En cuanto al tercer caso, a diferencia de Common Lisp, #'+ no lee como (function +) y se refieren al valor del símbolo + en el espacio de nombres de función, ya que Clojure no tiene un espacio de nombres de función. En cambio, se lee como (var +) y se refiere al var llamado +. Aplicar un var es lo mismo que aplicar el valor almacenado en el var.

En el segundo caso, está aplicando repetidamente un símbolo a un par de números. Esto es válido por accidente. La aplicación de un símbolo a un mapa es la misma que la indexación en ese mapa:

user> ('a {'a 1, 'b 2, 'c 3, '+ 4}) 
1 
user> ('+ {'a 1, 'b 2, 'c 3, '+ 4}) 
4 

Si proporciona un segundo argumento, se utiliza como valor por defecto en caso de que ninguna tecla correspondiente se encuentra en el mapa:

user> ('+ {'a 1, 'b 2, 'c 3} 4) 
4 

Dado que en cada iteración, aplica el símbolo + a un par de números, y como un número no es un mapa y, por lo tanto, no contiene + como clave, el segundo argumento se devuelve como valor predeterminado de una coincidencia fallida.

user> ('+ 'foo 4) 
4 
user> ('+ {} 4) 
4 
user> ('+ 1 4) 
4 
+0

Gran respuesta. Explicación clara del comportamiento no inmediatamente obvio. Gracias. – sw1nn

+0

Muchas gracias, Matthias. Pude entender lo que significa ''. No me di cuenta de Var, y lo ignoré, pero esta vez pude entenderlo más profundamente. También pude entender el segundo comportamiento del código. Gracias. –

Cuestiones relacionadas