function - guide - clojure tutorial
En Clojure, diferencia entre la función, la función entre comillas y la función de comillas definidas (1)
En clojure, me gustaría saber cuáles son las diferencias entre los tres a continuación.
(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 del segundo.
Siento que el primero y el tercero son iguales en clojure que es Lisp-1 y no distingue entre evaluar una variable y la función con el mismo nombre.
Esta puede ser una pregunta básica, pero parece que no hay suficiente información. Por favor enséñame.
Gracias.
Con respecto al tercer caso, a diferencia de Common Lisp, #''+
no se lee como (function +)
y se refiere al valor del símbolo +
en el espacio de nombres de funciones, ya que Clojure no tiene un espacio de nombres de funciones. En su lugar, se lee como (var +)
y se refiere a la var
llamada +
. Aplicar una var
es lo mismo que aplicar el valor almacenado en la var
.
En el segundo caso, estás aplicando repetidamente un símbolo a un par de números. Esto es válido por accidente. Aplicar un símbolo a un mapa es lo mismo que indexar 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 predeterminado en caso de que no se encuentre una clave coincidente en el mapa:
user> (''+ {''a 1, ''b 2, ''c 3} 4)
4
Como 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 una clave, el segundo argumento se devuelve como el valor predeterminado de una coincidencia fallida.
user> (''+ ''foo 4)
4
user> (''+ {} 4)
4
user> (''+ 1 4)
4