2014-04-08 9 views
6

Jako początkujący clojure, czytam kod clojure, aby zapoznać się z gramatyką Clojure'a. Poniżej fragment kodu jest funkcją w projekcie pierścieniaCo to jest attr-mapa funkcji clojure zdefiniowanej przez defn?

(defn- request-context 
"Create an UploadContext object from a request map." 
{:tag UploadContext} 
[request encoding] 
(reify UploadContext 
(getContentType [this]  (get-in request [:headers "content-type"])) 
(getContentLength [this]  (or (req/content-length request) -1)) 
(contentLength [this]  (or (req/content-length request) -1)) 
(getCharacterEncoding [this] encoding) 
(getInputStream [this]  (:body request)))) 

co nie jest dla mnie jasne jest linia

{:tag UploadContext} 

jeśli ocena definicja funkcji Clojure za

(defn function-name doc-string? attr-map? [parameter-list] 
conditions-map? 
(expressions)) 

Chyba (ale nie jestem pewien) mapa powinna być "attr-mapą?". Ale czym jest "attr-map?"? Szukałem go i nie mogę znaleźć dobrych wyjaśnień.

wszelkie przykłady lub linki do wprowadzenia "attr-map?" Będzie mile widziane. Chciałbym również wiedzieć, w jaki sposób wykorzystuje się attr-map w wklejonym kodzie.

Odpowiedz

3

Przekazywanie (opcjonalnie) attr-map? do defn jest skrótowym sposobem dodawania metadanych do zmiennej funkcji.

Metadane mogą zawierać wpisy, takie jak :tag (typ zwrotu w czasie wykonywania), :doc (ciąg dokumentacji) i :private (w celu wskazania, czy var jest prywatny dla przestrzeni nazw). Dodatkowe elementy metadanych może być również dołączony tam też, ale powinny być stosowane do danych, które są „prostopadły do ​​wartości logicznej danych” (cytat z http://clojure.org/functional_programming)

(defn greet {:tag String :other-meta-data 5} [name] (format "Hello, %s" name)) 

(meta #'f) 
;=> {:arglists ([name]), :ns #<Namespace user>, :name f, :end-column 8, :column 1, 
    :line 4 :other-meta-data 5, :file "NO_SOURCE_FILE", :end-line 4, 
    :tag java.lang.String} 
+0

dzięki Daniel. czy możesz podzielić się dowolnymi linkami na temat attr-map? – danny

+0

Możesz przeczytać trochę o metadanych na górze http://clojure.org/special_forms. ('attr-map?' to po prostu nazwa parametru dla mapy danych, która zostanie scalona z metadanymi w wariancie funkcji). –

+0

Wartość wykorzystania metadanych może różnić się od dewelopera do programisty. Twoje rzekome użycie słowa "powinien" nie było w oryginalnym kontekście cytatu "ortogonalne do logicznej wartości danych" zaczerpnięte z http://clojure.org/functional_programming. Może poprawić jakość twojej odpowiedzi, aby nie wstrzyknąć takiego błędu. – ctpenrose

Powiązane problemy