why tutorial guide code function clojure quote

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