Tuve que comentar la línea a continuación (el ejemplo es de http://en.wikibooks.org/wiki/Clojure_Programming/Examples/Lazy_Fibonacci )
(def fib-seq
;"Implements Fibonacci sequence (starts with 0)."
((fn rfib [a b]
(lazy-seq (cons a (rfib b (+ a b)))))
0 1))
Si lo dejara dentro, obtendría:
Clojure 1.2.0
java.lang.Exception: Too many arguments to def (Problem1.clj:1)
1:1 user=>
Puedo hacer esto con defn
, sin embargo. Ejemplo (lo sé, estoy reinventando la rueda porque even?
ya está definido):
(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=>
Solución del problema
(def ^{:doc "Implements Fib. sequence lazily."} fibs...)
(:doc (meta (var fibs)))
; "Implements Fib. sequence lazily."
Es bastante simple escribir una macro para que puedas escribir (def-with-docs foo "doc" 1)
.
(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)."
Además, tenga en cuenta que con su ejemplo de uso de defn
, la cadena de documentación debe preceder a los argumentos; de lo contrario, no se asociará con los metadatos del símbolo.
Alternativamente, se puede usar clojure.contrib.def/defvar.
No hay comentarios:
Publicar un comentario