2009-07-24 13 views
29

W jaki sposób wykorzystałeś metadane w swoim programie Clojure?Jakie są niektóre zastosowania metadanych Clojure?

Widziałem jeden przykład z Programming Clojure:

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

Jakie są zastosowania? Ta forma programowania jest dla mnie całkowicie nowa.

Odpowiedz

1

Metadane są szeroko używane przez kompilator do przechowywania rzeczy typu obiektu.
tego użyć, gdy dajesz rodzaj wskazówki

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

Użyłem go do przechowywania rzeczy jak ilość wyściółki, która została dodana do liczby. Jest przeznaczony dla informacji, które są "ortogonalne" dla danych i nie powinny być brane pod uwagę przy podejmowaniu decyzji, czy wartości są takie same.

24
  • Doctrings są zapisywane jako metadane pod klawiszem: doc. Jest to prawdopodobnie najbardziej oczywiste użycie metadanych numer 1.
  • Zwroty i typy parametrów można opcjonalnie oznaczyć metadanymi w celu zwiększenia wydajności, unikając narzutu na odzwierciedlenie typów w środowisku wykonawczym. Są one również znane jako "wskazówki typów". #^String to podpowiedź typu.
  • Przechowywanie rzeczy "pod maską" do użytku przez kompilator, takich jak arglista funkcji, numer wiersza, w którym został określony zmiennik, lub to, czy var zawiera odwołanie do makra. Są one zwykle automatycznie dodawane przez kompilator i zwykle nie muszą być manipulowane bezpośrednio przez użytkownika.
  • Tworzenie prostych testami jako część definicji funkcji:

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

    (test #'something)

Jeśli czytasz Programming Clojure, a następnie Rozdział 2 stanowi dobry wstęp do metadanych. Rysunek 2.3 przedstawia dobre podsumowanie wspólnych metadanych.

14

Dla różnorodności niektóre odpowiedź, która nie koncentruje się na interakcji z samym języku:

Można również np. śledzić źródło niektórych danych. Niezaznaczone dane wejściowe są oznaczone jako :tainted. Walidator może sprawdzić rzeczy, a następnie ustawić status na :clean. Kod powodujący istotne kwestie związane z bezpieczeństwem może następnie zostać zmieniony na :tainted i zaakceptować tylko wejście :clean ed.

5

Meta Data była dla mnie bardzo przydatna do pisania. Mówię nie tylko o podpowiedziach typu, ale o kompletnym systemie typu niestandardowego. Najprostszy przykład - przeciążenie wydruku metody elemencie (lub jakakolwiek inna zmienna):

(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 ...)) 

W ogóle, wraz z możliwościami walidacji Clojure może zwiększyć bezpieczeństwo, a jednocześnie, elastyczność kodzie bardzo dużo (chociaż zajmie to trochę więcej czasu, aby wykonać rzeczywiste kodowanie).

Aby uzyskać więcej pomysłów na pisanie, zobacz types-api.

Powiązane problemy