2014-04-08 8 views
6

Als Clojure-Anfänger lese ich Clojure-Code, um mich mit Clojures Grammatik vertraut zu machen. Below Codeausschnitt ist eine Funktion in Ring-ProjektWas ist die Attr-Map einer Clojure-Funktion, definiert durch 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)))) 

, was mir nicht klar ist, wird die Leitung

{:tag UploadContext} 

wenn prüfe Definition clojure Funktion

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

Ich denke, (aber nicht sicher) sollte die Karte die "attr-map" sein? Aber was ist eine "Attr-Map"? Ich habe gegoogelt und finde keine guten Erklärungen.

irgendwelche Beispiele oder Links zur Einführung der "attr-map?" wird geschätzt werden. Ich würde auch gerne wissen, wie die Attr-Map in dem Code verwendet wird, den ich eingefügt habe.

Antwort

3

Das Übergeben eines (optional) attr-map? an defn ist eine Kurzform, mit der Metadaten zum var einer Funktion hinzugefügt werden können.

Metadaten können Einträge wie :tag (Laufzeit-Rückgabetyp), :doc (eine Dokumentationszeichenfolge) und :private (um anzugeben, ob die Variable privat für einen Namespace ist) enthalten. Weitere Stücke von Metadaten können auch dort zu angebracht werden, sollten aber für Daten verwendet werden, die „orthogonal zu dem logischen Wert der Daten“ (Zitat aus http://clojure.org/functional_programming) ist

(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

dank Daniel. Kannst du bitte irgendwelche Links über die Attr-Map teilen? – danny

+0

Sie können ein wenig über Metadaten oben auf http://clojure.org/special_forms lesen. ('attr-map?' ist nur ein Parametername für die Zuordnung von Daten, die in die Metadaten der var der Funktion eingefügt werden). –

+0

Der Wert der Metadatennutzung kann sich von Entwickler zu Entwickler unterscheiden. Ihre eigensinnige Verwendung des Wortes "sollte" war nicht im ursprünglichen Kontext des Zitats "orthogonal zum logischen Wert der Daten", das aus http://clojure.org/functional_programming entnommen wurde. Es kann die Qualität Ihrer Antwort verbessern, um eine solche Voreingenommenheit nicht zu injizieren. – ctpenrose