2009-12-29 26 views
7

In clojure, come si digita tipo suggerimento un tipo che ho creato? (Voglio annidare i tipi.)Tipi annidati in clojure?

ad es. Avevo pensato che questo dovrebbe funzionare:

(deftype A 
    [#^somePrimitive someField]) 

(deftype B 
    [#^A Avalue]) 

Questo fa apparire un messaggio di errore:

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

Nota: i tipi Clojure sono una nuova funzionalità che attualmente esiste solo nella 'nuova' filiale di clojure.

Modifica: Sono stato confuso dai diversi modi di suggerimento del tipo in clojure per i tipi java e clojure. classi Java sono accennati come

#^java.some.class 

mentre i tipi Clojure sono accennati come:

#^:some.Namespace/type 

risposta

11

Per ogni deftype, viene creato un tag di tipo (fondamentalmente una parola chiave qualificata per lo spazio dei nomi) in modo da non dover compilare il codice AOT prima di poter utilizzare la classe risultante.

Se il tipo A è nello spazio dei nomi corrente, è possibile scrivere in questo modo:

(deftype B [^::A Avalue]) 

Per i tipi in altri spazi dei nomi, qualificare la parola utilizzando il suo namespace:

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

Fantastico, grazie! –

3

(DEFTYPE B [# ^: user/A Avalue]) funziona per me.

+0

che sembra funzionare , ma come farei la stessa cosa in altri file? +1, comunque. –

+0

Sì, l'ho capito ora. Molte grazie. –