2010-06-10 10 views
12

El sistema de Clojure para crear una jerarquía ad hoc de palabras clave es familiar para la mayoría de las personas que han pasado un poco de tiempo con el lenguaje. Por ejemplo, la mayoría de las demostraciones y presentaciones de la lengua incluyen ejemplos tales como¿Cuándo y cómo se deben usar las jerarquías independientes en clojure?

(derive ::child ::parent) 

y se van a mostrar cómo esto se puede utilizar para el envío de múltiples método.

En todas las diapositivas y presentaciones que he visto, utilizan la jerarquía global. Pero es posible poner relaciones de palabras clave en jerarquías independientes, utilizando (derivar h :: child :: parent), donde h es creado por (make-hierarchy). Algunas preguntas, por lo tanto:

  • ¿Existen directrices sobre cuándo esto es útil o necesario?
  • ¿Hay alguna función para manipular jerarquías?

La fusión es particularmente útil, así que hacer esto:

(defn merge-h [& hierarchies] 
    (apply merge-with (cons #(merge-with clojure.set/union %1 %2) hierarchies)) 

Pero me preguntaba si tales funciones ya existen en alguna parte.

EDIT: Se ha cambiado la jerarquía "personalizada" a la jerarquía "independiente", ya que ese término describe mejor a este animal. Además, investigué un poco e incluí mi propia respuesta a continuación. Otros comentarios son bienvenidos.

Respuesta

5

He profundizado en este problema en los últimos días, y creo que tengo algunas respuestas:

  1. Funciones utilizadas en jerarquías independientes tienen una semántica diferente de cuando se utilizan las mismas funciones en la jerarquía global . Hacer (derivar kwd1 kwd2) produce un efecto secundario: una entrada en la jerarquía global. Por otro lado, (derive hierarchy kwd1 kwd2) es funcional: la función devuelve una nueva jerarquía, en lugar de modificar una var.
  2. El uso de jerarquías independientes le permite tener varias jerarquías diferentes para las mismas palabras clave. Así, por ejemplo:

    (def baloncesto-jerarquía (derivar (make-jerarquía): Gretzky: Jordan))

    (def hockey-jerarquía (derivar (make-jerarquía): Jordan: Gretzky))

Podría indicar que: jordan es más alto en la jerarquía de baloncesto que: gretzky, mientras que lo contrario es cierto en la jerarquía de hockey.

También: las palabras clave sin nombre pueden colocarse en jerarquías independientes, pero no en la jerarquía global. Así

(derive (make-hierarchy) :a :b) 

va a funcionar, pero para la jerarquía global, estas palabras clave tendría que estar en un espacio de nombres:

(derive :nspace/a :nspace/b) 

donde NSPACE es cierto espacio de nombres. (Este espacio de nombres en realidad no tiene que ser declarado en ningún lugar, curiosamente.)

En resumen, las jerarquías independientes se deben usar cuando se necesita más de una jerarquía o cuando la jerarquía necesita modificarse extensamente durante el tiempo de ejecución. Además, si queremos una jerarquía para palabras clave desnudas, se requiere una jerarquía independiente.

+0

Una preocupación con el ejemplo de los deportes es: (isa? Hockey-hierarchy: jordan: gretzky) => true. es decir, estas son jerarquías de tipo. Pero el punto es válido: las mismas palabras podrían ser tipos diferentes en relaciones de tipos diferentes en diferentes dominios haciendo que las jerarquías locales sean necesarias. De hecho, me sorprende que podamos meternos con la jerarquía global. – kennytilton

Cuestiones relacionadas