2009-12-29 12 views
7

En clojure, ¿cómo escribo tipo sugerencia un tipo que he creado? (Quiero anidar los tipos.)Tipos anidados en clojure?

p. Yo había pensado que esto funcionaría:

(deftype A 
    [#^somePrimitive someField]) 

(deftype B 
    [#^A Avalue]) 

Esto nos lleva a un mensaje de error:

Unknown location: 
    error: java.lang.ClassNotFoundException: A 

Nota: Los tipos clojure son una nueva característica que existe actualmente sólo en la 'nueva' rama de clojure.

Edit: Estaba confundido por las diferentes formas de tipo de alusión en clojure para tipos java y clojure. clases Java se insinúan como

#^java.some.class 

mientras que los tipos clojure se insinúan como:

#^:some.Namespace/type 

Respuesta

11

Para cada tipo de definición, se crea una etiqueta de tipo (básicamente una palabra clave calificada como espacio de nombres) para que no tenga que compilar AOT su código antes de poder utilizar la clase resultante.

Si el tipo A es en el espacio de nombres actual, puede escribir así:

(deftype B [^::A Avalue]) 

Para los tipos en otros espacios de nombres, calificar la palabra clave usando su espacio de nombres:

(deftype B [^:user/A Avalue]) 
+0

¡Impresionante, gracias! –

3

(DEFTYPE B [^ #: user/A Avalue]) funciona para mí.

+0

que parece funcionar , pero ¿cómo haría lo mismo en otros archivos? +1, de todos modos. –

+0

Sí, lo descubrí ahora. Muchas gracias. –

Cuestiones relacionadas