2010-12-11 9 views
4

Ich hatte die Linie unten (Beispiel aus http://en.wikibooks.org/wiki/Clojure_Programming/Examples/Lazy_Fibonacci ist) auszukommenWie füge ich einer Sequenz, die über def in Clojure definiert wurde, einen Meta/Kommentar hinzu?

(def fib-seq 
    ;"Implements Fibonacci sequence (starts with 0)." 
    ((fn rfib [a b] 
    (lazy-seq (cons a (rfib b (+ a b))))) 
    0 1)) 

Wenn ich es in links, würde ich bekommen:

Clojure 1.2.0 
java.lang.Exception: Too many arguments to def (Problem1.clj:1) 
1:1 user=> 

Ich kann dies tun mit defn jedoch. Beispiel (ich weiß, ich das Rad für even? bin neu zu erfinden ist bereits definiert): (def Symbol init)

(defn is-even? [n] 
    "Returns true if the number is even, false otherwise." 
    (== (mod n 2) 0)) 


Clojure 1.2.0 
1:1 user=> (is-even? 3) 
false 
1:2 user=> (is-even? 4) 
true 
1:3 user=> 
+0

Sie sollten MayDaniels Antwort als richtig markieren. – semperos

Antwort

4

(def ^{:doc "Implements Fib. sequence lazily."} fibs ...)

(:doc (meta (var fibs)))

; "Implements Fib. sequence lazily."


Es ist einfach genug, um einen Makro zu schreiben, so dass Sie (def-with-docs foo "doc" 1) schreiben können.

(defmacro def-with-docs [name docstring value] 
    `(def ~(with-meta name {:doc docstring}) ~value)) 

(def-with-docs fib-seq "Implements Fibbonaci sequence (starts with 0)." 
    ((fn rfib [a b] (lazy-seq (cons a (rfib b (+ a b))))) 0 1)) 

(:doc (meta (var fib-seq)))

; "Implements Fibbonaci sequence (starts with 0)."


Beachten Sie auch, dass mit Ihrem Beispiel Verwendung von defn, die docstring die Argumente vorangestellt werden soll, sonst wird es nicht mit den Metadaten der Symbol zugeordnet werden.


Alternativ kann man clojure.contrib.def/defvar verwenden.

+1

Siehe clojure.contrib.def/defvar für ein bestehendes Makro –

0

Von http://clojure.org/special_forms#def

schafft und Praktikanten oder sucht einen globalen var mit dem Namen des Symbols und eines Namensraums des Werts des aktuellen Namensraums.

Von http://clojure.github.com/clojure/clojure.core-api.html#clojure.core/defn

(defn Namen doc-string? Attr-Karte? [params *] Körper) ist das gleiche wie (def name (fn [params *] exprs *)) mit jedem Doc-String oder attrs hinzugefügt zu den var-Metadaten.

Also, wenn Sie (def fib-Seq "Ihr Kommentar" (...)) schreiben, Sie versuchen, ein Symbol fib-Seq mit dem Wert "Ihr Kommentar" und clojure zu definieren klagt auch dort sind viele Argumente.

+0

Ok, also wie füge ich dann Kommentare/Dokumentationen hinzu? –

4

Dieses Problem ist bereits in den neuen Alpha-Versionen für Clojure 1.3 "behoben", wobei def einen optionalen Docstring unterstützt.

user> (clojure-version) 
"1.3.0-alpha3" 

user> (def answer "the answer to the final question" 42) 
#'user/answer 

user> (doc answer) 
------------------------- 
user/answer 
nil 
    the answer to the final question 
nil 
+0

Danke, wann wird diese Version stabil sein? –

Verwandte Themen