GOOGLE ADS

martes, 3 de mayo de 2022

¿Cómo agregar un meta/comentario a una secuencia definida a través de def en Clojure?

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

Regla de Firestore para acceder a la generación de subcolección Permisos faltantes o insuficientes

Tengo problemas con las reglas de Firestore para permitir el acceso a algunos recursos en una subcolección. Tengo algunos requests document...