2009-07-24 8 views
29

Comment avez-vous utilisé les métadonnées dans votre programme Clojure?Quelles sont les utilisations des métadonnées de Clojure?

j'ai vu un exemple de programmation Clojure:

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

Quelles sont les utilisations? Cette forme de programmation est complètement nouvelle pour moi. Les métadonnées sont largement utilisées par le compilateur pour des choses comme le stockage du type d'un objet.

Répondre

1


vous utilisez quand vous donnez le type laisse deviner

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

Je l'ai utilisé pour des choses comme le stockage de la quantité de remplissage qui a été ajouté à un certain nombre. Il est destiné à des informations qui sont «orthogonales» aux données et ne doit pas être pris en compte lorsque vous décidez si vos valeurs sont les mêmes.

24
  • Les documents sont stockés en tant que métadonnées sous la clé: doc. C'est probablement l'utilisation la plus apparente des métadonnées.
  • Les types de retour et de paramètre peuvent être éventuellement balisés avec des métadonnées pour améliorer les performances en évitant le temps de réflexion sur les types lors de l'exécution. Ils sont également connus sous le nom de "conseils de type". #^String est un indice de type.
  • Stocker des choses "sous le capot" pour une utilisation par le compilateur, comme l'arglist d'une fonction, le numéro de ligne où un var a été défini, ou si un var détient une référence à une macro. Ceux-ci sont généralement ajoutés automatiquement par le compilateur et n'ont normalement pas besoin d'être manipulés directement par l'utilisateur.
  • Création testcases simples dans le cadre d'une définition de fonction:

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

    (test #'something)

Si vous lisez la programmation Clojure, puis le chapitre 2 fournit une bonne introduction aux métadonnées. La figure 2.3 fournit un bon résumé des métadonnées communes.

14

Pour la diversité une réponse, qui ne se concentre pas sur l'interaction avec la langue elle-même:

Vous pouvez également par exemple. suivre la source de certaines données. L'entrée non cochée est marquée :tainted. Un validateur peut vérifier les éléments, puis définir l'état sur :clean. Code faisant des choses pertinentes de sécurité pourrait alors barf sur :tainted et seulement accepter :clean ed entrée.

5

Méta-données était extrêmement utile pour moi à des fins de typage. Je ne parle pas seulement des conseils de type, mais du système de type personnalisé complet. Simplest exemple - surcharge d'impression méthode pour struct (ou tout autre 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 ...)) 

En général, ainsi que les capacités de validation Clojure, il peut accroître la sécurité et, en même temps, la flexibilité de votre code très très bien (bien qu'il faudra un peu plus de temps pour faire un codage réel).

Pour plus d'idées sur la saisie, voir types-api.

Questions connexes