2010-02-19 35 views
14

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

+0

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? –

+0

Estoy de acuerdo. Es más un "es lo mismo que una no evaluación". Gracias por señalar esto. –

Respuesta

21
  1. ':a es la abreviatura de (quote :a).

  2. (eval '(quote form)) devuelve form por definición. Es decir, si la función Clojure eval recibe como argumento una estructura de lista cuyo primer elemento es el símbolo quote, 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 comportamiento eval cuando su argumento es una estructura de lista del formulario (quote foo) es el de devolver foo sin cambios, independientemente de lo que es.

  3. 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 ...).

  4. 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 de eval, 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 comportamiento eval que se envía a cuando se pasa una palabra clave como argumento.

  5. 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.

  6. 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ón eval, por supuesto, pero la semántica siempre se conserva, por lo que que todavía actúa como si fuera eval recibiendo una estructura de lista que contiene el símbolo println y la palabra clave :a).

  7. 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.

+0

Gracias por la explicación detallada Michal. Entonces eval considerará el tipo de ': a' y como devolverá una palabra clave: a? –

+0

@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. –

+0

Creo que 2. debería ser (eval (formulario de cotización)) –

Cuestiones relacionadas