2009-07-24 8 views
29

Come hai usato i metadati nel tuo programma Clojure?Quali sono alcuni usi dei metadati Clojure?

ho visto un esempio da programmazione Clojure:

(defn shout [#^{:tag String} message] (.toUpperCase message)) 
;; Clojure casts message to String and then calls the method. 

Quali sono alcuni usi? Questa forma di programmazione è completamente nuova per me.

risposta

1

i metadati sono ampiamente utilizzati dal compilatore per cose come la memorizzazione del tipo di oggetto.
si utilizza questo tipo quando si dà suggerimenti

(defn foo [ #^String stringy] .... 

L'ho usato per cose come la conservazione della quantità di imbottitura che è stato aggiunto a un numero. È inteso per informazioni che sono "ortogonali" ai dati e non dovrebbero essere prese in considerazione quando si decide se i valori sono gli stessi.

24
  • Le stringhe sono memorizzate come metadati sotto la chiave doc. Questo è probabilmente il numero 1 più evidente dell'uso di metadati.
  • I tipi di ritorno e di parametro possono essere facoltativamente contrassegnati con metadati per migliorare le prestazioni evitando il sovraccarico di riflessione sui tipi in fase di esecuzione. Questi sono anche noti come "suggerimenti tipo". #^String è un suggerimento sul tipo.
  • Memorizzare le cose "sotto il cofano" per l'utilizzo da parte del compilatore, come l'arglist di una funzione, il numero di riga in cui è stata definita una var, o se una var contiene un riferimento a una macro. Questi sono di solito aggiunti automaticamente dal compilatore e normalmente non devono essere manipolati direttamente dall'utente.
  • Creazione di casi di test semplici come parte di una definizione di funzione:

    (defn #^{:test (fn [] (assert true))} something [] nil)

    (test #'something)

Se stai leggendo programmazione Clojure, quindi Capitolo 2 fornisce una buona introduzione ai metadati. La Figura 2.3 fornisce un buon riepilogo dei metadati comuni.

14

Per la diversità qualche risposta, che non si concentra su interazione con il linguaggio stesso:

È anche possibile ad es. traccia la fonte di alcuni dati. L'input non controllato è contrassegnato come :tainted. Un validatore potrebbe controllare le cose e quindi impostare lo stato su :clean. Il codice che fa le cose rilevanti per la sicurezza potrebbe quindi apparire su :tainted e accettare solo l'input :clean ed.

5

Meta Data è stato estremamente utile per me ai fini della digitazione. Sto parlando non solo di suggerimenti sui tipi, ma del sistema di tipo personalizzato completo. Più semplice esempio - sovraccarico di metodi di stampa per le strutture (o qualsiasi altro var):

(defstruct my-struct :foo :bar :baz) 

(defn make-my-struct [foo bar baz] 
    (with-meta (struct-map my-struct :foo foo :bar baz :baz baz) 
     {:type ::my-struct})) 


(defmethod print-method 
    [my-struct writer] 
    (print-method ...)) 

In generale, insieme a capacità di validazione Clojure si può aumentare la sicurezza e, allo stesso tempo, la flessibilità del codice molto molto (anche se ci vorrà un po 'più di tempo per fare la vera codifica).

Per ulteriori idee sulla digitazione, vedere types-api.