Citando en clojure resulta en no evaluación. ':a
y :a
devuelven el mismo resultado. ¿Cuál es la diferencia entre ': a y: a? Uno no se evalúa y otro se evalúa a sí mismo ... ¿pero es lo mismo que no evaluación?Usando cotización en Clojure
Respuesta
':a
es la abreviatura de(quote :a)
.(eval '(quote form))
devuelveform
por definición. Es decir, si la función Clojureeval
recibe como argumento una estructura de lista cuyo primer elemento es el símboloquote
, devuelve el segundo elemento de dicha estructura de lista sin transformarlo de ninguna manera (por lo tanto, se dice que la forma citada es no evaluado). En otras palabras, se distribuye el comportamientoeval
cuando su argumento es una estructura de lista del formulario(quote foo)
es el de devolverfoo
sin cambios, independientemente de lo que es.Al escribir el literal
:a
en su programa, se pone lectura en como la palabra clave:a
; es decir, la pieza concreta de texto:a
se convierte en una estructura de datos en memoria que se llama la palabra clave:a
(Lisp siendo homoicónico significa que ocasionalmente es difícil distinguir entre la representación textual de los datos Lisp y los datos mismos, incluso cuando esto sería útil para propósitos explicativos ...).La estructura de datos en memoria correspondiente al literal
:a
es un objeto de Java que expone una serie de métodos, etc., y que tiene la interesante propiedad de que la función deeval
, cuando recibe este objeto de datos como un argumento, devoluciones sin cambios En otras palabras, la palabra clave "evaluación a sí mismo" sobre la que pregunta es solo el comportamientoeval
que se envía a cuando se pasa una palabra clave como argumento.Así, cuando
eval
ve':a
, se trata como una forma citado y devuelve la segunda parte del mismo, que pasa a ser:a
. Cuando, por otro lado,eval
ve:a
, lo trata como una palabra clave y lo devuelve sin cambios. El valor de retorno es el mismo en ambos casos (es solo la palabra clave:a
); el proceso de evaluación es ligeramente diferente.Semántica Clojure - de hecho semántica Lisp, para cualquier dialecto de Lisp - se especifican en términos de los valores devueltos y los efectos secundarios causados por la función
eval
cuando recibe varias estructuras de datos Lisp como argumentos. Por lo tanto, lo anterior explica lo que realmente debe ocurrir al escribir':a
o:a
en su programa (código como(println :a)
puede compilarse en un bytecode eficiente que en realidad no codifica la funcióneval
, por supuesto, pero la semántica siempre se conserva, por lo que que todavía actúa como si fueraeval
recibiendo una estructura de lista que contiene el símboloprintln
y la palabra clave:a
).La idea clave aquí es que, independientemente de si la forma que se está evaluando es
':a
o:a
, la estructura de datos de palabras clave se construye en el tiempo de lectura; luego, cuando se evalúa una de estas formas, esa estructura de datos se devuelve sin cambios, aunque por diferentes motivos.
Gracias por la explicación detallada Michal. Entonces eval considerará el tipo de ': a' y como devolverá una palabra clave: a? –
@Icarus: De nada. Y sí, eval devuelve ': a' sin cambios porque sabe que eso es lo que se supone que debe hacer con las palabras clave. Internamente, esto se implementa en realidad como un despacho basado en clases en el compilador, utilizando las instalaciones para el despacho basado en clases proporcionadas por la JVM; pero eso es un detalle de implementación. –
Creo que 2. debería ser (eval (formulario de cotización)) –
- 1. Problemas con clojure Cotización en paren `(...) macro
- 2. Cotización de acciones API?
- 3. buscando una cotización bursátil intradía
- 4. diferencia cotización normal y backquote en Python
- 5. Mapa reciente en clojure usando enfriamiento newtoniano
- 6. diferentes marcas de la cotización de MySQL
- 7. mysql error php - sistema de cotización
- 8. expresiones válidas para la función cotización
- 9. Agrupación (fkmeans) con Mahout usando Clojure
- 10. Usando clojure y leiningen con IDEs
- 11. de escape cotización individual en función de JavaScript parámetros
- 12. ¿Cómo centro una cotización, vertical y horizontalmente en látex?
- 13. ¿Dónde poner al autor en una cotización de descuento?
- 14. Bash: la expansión de variables en Cotización Individual/Doble Cita
- 15. Uso de cotización dentro de las cadenas en Delphi
- 16. "reducir" o "aplicar" usando funciones lógicas en Clojure
- 17. programa de bolas de rebote multiproceso usando agentes en Clojure
- 18. Usando la clase JRuby suministrada en una joya de Clojure
- 19. Actores en Clojure
- 20. bloques iterador en Clojure?
- 21. GUI complejo en clojure
- 22. CSS 3: Agregar símbolo de cotización al comienzo de blockquote
- 23. ¿Qué estilo de cotización de cuerdas Ruby prefieres?
- 24. Composición de funciones en Clojure?
- 25. Importación de CSV error de cotización me está volviendo loco
- 26. Ámbito dinámico en Clojure?
- 27. ¿Cuál es su manera de hacer aplicaciones GAE usando Clojure?
- 28. Implementación de estructuras de datos personalizadas usando Clojure Protocols
- 29. Forma idiomática de renderizar información de estilo usando Clojure Hiccup
- 30. ¿Tiene R operadores de tipo cotización como Perl's qw()?
No está claro lo que estás preguntando. ¿Quiere decir "Cómo funciona el lector Clojure"? ¿Qué tipo de explicación respondería a tu pregunta? El hecho es que las palabras clave se evalúan a sí mismas. ¿Qué significa "cómo" en ese contexto? –
Estoy de acuerdo. Es más un "es lo mismo que una no evaluación". Gracias por señalar esto. –